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

时间:2010-11-04 07:29:43

标签: c struct linked-list field

struct node{  
    struct node next;  
    int id;  
}

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

这个结构有什么问题?

6 个答案:

答案 0 :(得分:12)

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

struct node;

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

...应该可行,但在使用时请注意正确分配内存。

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

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

答案 1 :(得分:5)

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

这就是为什么它只能包含指针到它自己的类型。

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

答案 2 :(得分:2)

  1. 你需要做一个节点的前向声明,因为编译器在处理它的定义时还不知道node
  2. 您可能意味着存储指针,而不是节点对象本身。
  3. 试试这个:

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

答案 3 :(得分:1)

不完整类型的某些用法是不正确的,例如当您尝试声明不完整类型的对象时。但是,您可以声明指向不完整类型的指针(例如)。在这种情况下,这就是这里所需要的:

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

答案 4 :(得分:0)

问题是,当编译器到达这一行时:

struct node{  
    struct node next;  /* << this line */

编译器实际上不知道struct node是什么,因为你正在定义struct node

通常,您不能使用未定义或不完整的类型。

答案 5 :(得分:0)

为了工作,你应该写:

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