3

Please help me to figure out a very basic confusion as follows,

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

is ok, but the following gives an compile error(unknown type). I know it is wrong, but unable to figure out a clear reason.

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

5 回答 5

2

C 允许您拥有指向不完整类型的指针。

struct node *next是对结构节点的前向引用,但是由于您只是声明了指向该类型的指针,因此编译器并不介意。这是明确允许的,它允许构建相互引用的结构。

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

于 2013-11-12T03:05:06.973 回答
2

从语法上讲,这是因为struct类型在结束之前是不完整的}。您可以使用不完整的类型来声明指向它的指针,但要声明类型本身。

此外,定义其中包含自身的 a 是没有意义的struct,它的大小是未知的。

于 2013-11-12T03:05:13.930 回答
1

结构在这一点上没有完全定义。如果它是一个指针,它确实知道指向结构的指针有多大。

如果你想想你想要做什么,一个递归数据类型,它会有点奇怪,这将是一个无限递归。

于 2013-11-12T03:04:24.823 回答
1

主要原因是node在您完成定义 node 并关闭它之前它不是一个完整的类型},因此编译器没有足够的信息,但您可以拥有一个指向不完整类型的指针。

更基本的原因是如果node包含 a node,它将需要无限的空间,因为自引用永远不会结束。一个节点包含一个node包含一个node 无穷大的节点。

如果我们看一下 C99 标准草案的6.2.5 Types部分说:

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

并且还说(*强调我的*0:

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

于 2013-11-12T03:04:58.930 回答
0

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

该结构必须足够大以存储它的所有成员。但是它的一个成员是相同类型的结构,因此它需要为两组成员存储足够的内存。但是等等,这个内部结构本身包含另一个结构实例——所以我们有三组成员。并且那个内部包含一个内部结构,它本身包含一个内部结构,依此类推到无穷大。

那么从逻辑上讲,一个结构不可能包含自己。

于 2013-11-12T03:08:58.230 回答