C - 结构不保持自我类型的原因

  • 本文关键字:类型 自我 结构 c struct
  • 更新时间 :
  • 英文 :


请帮我找出一个非常基本的困惑,如下所示,

 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:

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

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

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

因此,结构在逻辑上不可能包含自身。

最新更新