结构体为什么不能持有自身类型?

3

请帮我解决一个非常基础的困惑,具体如下:

 struct node {
        struct node *next; // no compile error
 }

is ok,但下面的代码会报编译错误(未知类型)。我知道它是错的,但是无法确定原因。

 struct node {
        struct node next; // compile error, unknown type..why?
 } 

1
一个 struct node 的字节数是多少? - mu is too short
5个回答

2

C语言允许您使用指向不完整类型的指针。

struct node *next是对struct node的前向引用,但由于您只声明了对该类型的指针,编译器并不在意。这是明确允许的,它使构建相互引用的结构成为可能。

您不需要完整的类型来声明指针。现在如果有一个成员struct node next;,您将会得到一个错误,因为它是一个无休止的递归。


2
语法上,struct类型在遇到闭合的}之前是不完整的。你可以使用不完整的类型来声明指向它的指针,但是不能定义这个类型本身。
此外,定义一个包含自身的struct是没有意义的,因为它的大小是未知的。

1
该结构在此时没有被完全定义。如果它是指针,它确实知道指向一个结构体的指针有多大。
考虑你正在尝试做什么——递归数据类型,这有点奇怪,因为它将导致无限递归。

1
主要原因是在你完成定义并用 } 结束之前,node 不是一个完整的类型,因此编译器没有足够的信息,但允许您拥有对不完整类型的指针。
更基本的原因是如果 node 包含一个 node,它将需要无限空间,因为自我引用永远不会结束。一个节点包含一个 node 包含一个 node ad infinitum
如果我们看一下草案 C99 标准第 6.2.5Types,它说:

[...] 不完全类型(描述对象但缺少确定其大小所需的信息)

它还说(*我强调*):

可以从函数类型、对象类型或不完整类型派生指针类型,称为引用类型。[...]


0

存储此结构需要无限量的内存。

该结构必须足够大,以存储其所有成员。然而,其中一个成员是同一类型的结构体,因此它需要为两组成员存储足够的内存。但是,请等一下,该内部结构包含另一个实例的结构体 - 因此我们有三组成员。而该内部结构包含一个内部结构,该内部结构本身包含一个内部结构,依此类推到无限。因此,逻辑上不可能让一个结构体包含自己。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接