为什么我们在自引用结构中使用指针?

Why do we use pointers in self referential structs?

为什么我们在自引用结构中使用指针?它是强制性的还是非强制性的?如果不是,与普通结构定义相比,在结构中使用指向结构的指针有什么优势?

typedef struct _Struct {
  struct _Struct* next;  // do we really need this pointer?
} Struct;

您不能在结构定义中使用 struct _Struct 类型成员变量,因为它必须是完整类型才能这样做。但是 struct _Struct 在满足声明的 } 之前是不完整的。

但是对于指针我们可以这样做,因为指针的大小是相同的,无论是指向完整类型还是不完整类型的指针 - 因此当编译器读取它们时,它可以决定它的大小。 (与它引用自身的情况不同)。

它必须是指针而不是结构本身,因为类型还不完整 - 不知道它的大小。

支持我所说的 - 来自 standard §6.7.2.1p3

A structure or union shall not contain a member with incomplete or function type (hence, a structure shall not contain an instance of itself, but may contain a pointer to an instance of itself), except that the last member of a structure with more than one named member may have incomplete array type; such a structure (and any union containing, possibly recursively, a member that is such a structure) shall not be a member of a structure or an element of an array.

还有什么时候完成的?来自 §6.7.2.1p8

The presence of a struct-declaration-list in a struct-or-union-specifier declares a new type, within a translation unit. The struct-declaration-list is a sequence of declarations for the members of the structure or union. If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined. The type is incomplete until immediately after the } that terminates the list, and complete thereafter.

如果有人问什么是struct 或union 的不完整类型?来自 standard §6.2.5p22

A structure or union type of unknown content (as described in 6.7.2.3) is an incomplete type.

这就是为什么我们不能使用正在声明的结构的实例 - 因为它的大小是不可能知道的。

指针具有固定大小,因此编译器可以在解析时确定结构_Struct的大小。

如果_Struct在物理上包含自己,则无法确定其大小,这是一个循环定义。

结构包含作为外部结构实例的成员是没有意义的。除了要求您声明一个不完整的类型之外,它将是无限的并且永远不会有足够的字节,因为您添加的每个实例也将需要一个实例。

使用指针没问题;然而,这种方法通常用于创建链表等。指针指向链中的下一个实例。