请帮我找出一个非常基本的困惑,如下所示,
struct node {
struct node *next; // no compile error
}
没问题,但下面给出编译错误(未知类型)。我知道这是错误的,但无法找出一个明确的原因。
struct node {
struct node next; // compile error, unknown type..why?
}
C 允许你拥有指向不完整类型的指针。
struct node *next
是对结构节点的前向引用,但由于您只声明指向该类型的指针,因此编译器并不介意。这是明确允许的,它允许构建相互引用的结构。
不需要完整的类型来声明指针。现在一个成员struct node next;
你会得到一个错误,因为它是一个永无止境的递归。
语法上,这是因为struct
类型在结束}
之前是不完整的。可以使用不完整的类型来声明指向它的指针,但可以使用类型本身。
此外,定义一个包含自身的struct
是没有意义的,它的大小是未知的。
结构尚未完全定义。 如果它是一个指针,它确实知道指向结构的指针有多大。
如果你考虑一下你想做什么,一个递归数据类型,它有点奇怪,它将是一个无限递归。
主要原因是node
不是完整的类型,直到您完成定义 node 并使用 }
关闭它,因此编译器没有足够的信息,但允许您有一个指向不完整类型的指针。
更基本的原因是,如果node
包含node
,它将需要无限的空间,因为自我引用永远不会结束。节点包含无穷无尽node
node
。
如果我们看一下C99标准草案部分6.2.5
类型说:
[...]不完整的类型(描述对象但缺乏确定其大小所需的信息的类型)
并且还说(*强调我的*0:
指针类型可能派生自函数类型、对象类型或不完整的类型 类型,称为引用类型。[...]
存储此结构需要无限量的内存。
结构必须足够大,以存储其所有成员。 但是,它的成员之一是同一类型的结构,因此它需要为两组成员存储足够的内存。 但是等等,该内部结构包含其内部结构的另一个实例 - 所以我们有三组成员。 那个内在包含一个内在结构,它本身,包含一个内在结构,依此类推,直到无穷大。
因此,结构在逻辑上不可能包含自身。