繁体   English   中英

为什么递归 typedef 允许指针不匹配?

[英]Why is a pointer mismatch allowed for a recursive typedef?

我一直在 learn-c.org 上学习 C

在介绍了有关 typedef 声明和结构的单元之后。 他们完成了他们所谓的“链表的递归定义”,我发现它相当简单,除了看起来像不匹配的指针......

typedef struct node{
    int val;
    struct node* next;
}node_t

// usage

node_t* head = NULL;
head = (node_t*) malloc(sizeof(node_t));
head->val = 1;
head->next = (node_t*) malloc(sizeof(node_t));
head->next->val = 2;
head->next->next = (node_t*) malloc(sizeof(node_t));
head->next->next->val = 3;

我的理解是,通过提供typedef struct node ,我们可以在结构中声明next节点指针。

我的困惑发生在第 11 行。我们为下一个节点动态分配 memory,但我们将 void 指针转换为node_t指针,而不是node指针——尽管head->next(node*)类型。 为什么允许这样做? C 是否只是在幕后重铸为(node*) ,而(node_t*)用于提高可读性?

typedef使node_t等效于struct node ,因此在任何可能使用struct node的地方都可以使用较短的node_t 所以(node_t*)等价于(struct node*)

一个例外是在结构声明本身内部,因为要定义的名称在typedef语句之后才能使用(就像在声明它们之前不能使用 function 或变量一样)。

顺便说一句,没有必要强制转换malloc()的结果。 它返回void* ,并且 C 允许将其分配给任何指针类型,而无需显式强制转换。 请参阅是否要转换 malloc 的结果?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM