请帮我解决一个非常基础的困惑,具体如下:
struct node {
struct node *next; // no compile error
}
is ok,但下面的代码会报编译错误(未知类型)。我知道它是错的,但是无法确定原因。
struct node {
struct node next; // compile error, unknown type..why?
}
C语言允许您使用指向不完整类型的指针。
struct node *next
是对struct node的前向引用,但由于您只声明了对该类型的指针,编译器并不在意。这是明确允许的,它使构建相互引用的结构成为可能。
您不需要完整的类型来声明指针。现在如果有一个成员struct node next;
,您将会得到一个错误,因为它是一个无休止的递归。
struct
类型在遇到闭合的}
之前是不完整的。你可以使用不完整的类型来声明指向它的指针,但是不能定义这个类型本身。struct
是没有意义的,因为它的大小是未知的。}
结束之前,node
不是一个完整的类型,因此编译器没有足够的信息,但允许您拥有对不完整类型的指针。node
包含一个 node
,它将需要无限空间,因为自我引用永远不会结束。一个节点包含一个 node
包含一个 node
ad infinitum。6.2.5
节 Types,它说:
它还说(*我强调*):[...] 不完全类型(描述对象但缺少确定其大小所需的信息)
可以从函数类型、对象类型或不完整类型派生指针类型,称为引用类型。[...]
存储此结构需要无限量的内存。
该结构必须足够大,以存储其所有成员。然而,其中一个成员是同一类型的结构体,因此它需要为两组成员存储足够的内存。但是,请等一下,该内部结构包含另一个实例的结构体 - 因此我们有三组成员。而该内部结构包含一个内部结构,该内部结构本身包含一个内部结构,依此类推到无限。因此,逻辑上不可能让一个结构体包含自己。
struct node
的字节数是多少? - mu is too short