下一个结构项,不完整类型
struct node{ struct node next; int id; }
给出“下一个字段有不完整的类型错误”。
这个结构有什么问题?
在创建自引用数据类型时,需要使用指针来解决循环问题:
struct node; struct node { struct node * next; int id; }
…应该可以工作,但在使用时请注意正确分配内存。
为什么指针? 考虑一下: struct
定义的要点是,当你说node.id
时,编译器可以计算出要分配多少内存以及要访问哪些部分。 如果您的node
结构包含另一个node
结构,那么编译器应该为给定node
分配多少内存?
通过使用指针可以解决这个问题,因为编译器知道为指针分配多少空间。
如果结构可以包含其自己类型的另一个实例,则其大小将是无限的。
这就是它只能包含指向它自己类型的指针的原因。
此外,在代码中的那一点,结构的大小是未知的,因此编译器无法知道为它保留多少空间。
- 您需要执行节点的前向声明,因为编译器在处理其定义时还不知道
node
。 - 您可能意味着存储指针,而不是节点对象本身。
试试这个:
struct node; struct node{ struct node *next; int id; };
不完整类型的某些用法是不正确的,例如当您尝试声明不完整类型的对象时。 但是,您可以声明指向不完整类型的指针(例如)。 在这种情况下,这正是这里所需要的:
struct node{ struct node *next; int id; };
问题是,当编译器到达这一行时:
struct node{ struct node next; /* << this line */
编译器实际上不知道什么是struct node
,因为你正在定义struct node
。
通常,您不能使用未定义或不完整的类型。
为了工作,你应该写:
typedef struct _node{ struct _node* next; int id; }node;