下一个结构项,不完整类型

struct node{ struct node next; int id; } 

给出“下一个字段有不完整的类型错误”。

这个结构有什么问题?

在创建自引用数据类型时,需要使用指针来解决循环问题:

 struct node; struct node { struct node * next; int id; } 

…应该可以工作,但在使用时请注意正确分配内存。

为什么指针? 考虑一下: struct定义的要点是,当你说node.id时,编译器可以计算出要分配多少内存以及要访问哪些部分。 如果您的node结构包含另一个node结构,那么编译器应该为给定node分配多少内存?

通过使用指针可以解决这个问题,因为编译器知道为指针分配多少空间。

如果结构可以包含其自己类型的另一个实例,则其大小将是无限的。

这就是它只能包含指向它自己类型的指针的原因。

此外,在代码中的那一点,结构的大小是未知的,因此编译器无法知道为它保留多少空间。

  1. 您需要执行节点的前向声明,因为编译器在处理其定义时还不知道node
  2. 您可能意味着存储指针,而不是节点对象本身。

试试这个:

 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;