C 下一个结构项,不完整类型
给出“字段下一个有不完整的类型错误”C 下一个结构项,不完整类型,c,struct,linked-list,field,C,Struct,Linked List,Field,给出“字段下一个有不完整的类型错误” 此结构有什么问题?问题是,当编译器到达这一行时: struct node{ struct node next; int id; } struct节点{ 结构节点下一步;/* 您需要对节点进行前向声明,因为编译器在处理其定义时还不知道node 您可能想存储指针,而不是节点对象本身 试试这个: struct node{ struct node next; /* << this line */ 创建自引用数
此结构有什么问题?问题是,当编译器到达这一行时:
struct node{
struct node next;
int id;
}
struct节点{
结构节点下一步;/*
您需要对节点进行前向声明,因为编译器在处理其定义时还不知道node
您可能想存储指针,而不是节点对象本身
试试这个:
struct node{
struct node next; /* << this line */
创建自引用数据类型时,需要使用指针来解决循环性问题:
struct node;
struct node{
struct node *next;
int id;
};
…应该可以工作,但使用时请注意正确分配内存
为什么一个指针?考虑这个问题:一个代码>结构> /CODE定义的点是这样的,编译器可以计算出分配多少内存以及当你说“代码>节点.ID/CODE >时要访问哪些部分。如果你的代码>节点< /COD>结构包含另一个<代码>节点< /Calp>Stutt,编译器应该为给定的<代码>节点分配多少内存。
使用指针可以避免这种情况,因为编译器知道为指针分配多少空间。不完整类型的某些用法格式不正确,例如当您试图声明不完整类型的对象时。但是,您可以声明指向不完整类型的指针(例如).在这种情况下,这正是这里需要的:
struct node;
struct node {
struct node * next;
int id;
}
如果一个结构可以包含它自己类型的另一个实例,那么它的大小将是无限的
这就是为什么它只能包含指向自己类型的指针
此外,在代码中的这一点上,结构的大小是未知的,因此编译器无法知道为它保留多少空间。为了工作,您应该编写:
struct node{
struct node *next;
int id;
};
不需要转发声明,因为结构的声明充当其自身的转发声明。问题完全在于他试图将结构放在其内部,并且应该使用指针。以下划线开头的标识符保留给实现awoodland:仅下划线+大写字母或双下划线。实际实际上,编译器已经知道了这一点。真正的问题是由于自引用性,
struct
将具有无限大小。解决方案是使用指针(struct node*next
);-)
typedef struct _node{
struct _node* next;
int id;
}node;