[英]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.