为什么我们在自引用结构中使用指针?
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
在物理上包含自己,则无法确定其大小,这是一个循环定义。
结构包含作为外部结构实例的成员是没有意义的。除了要求您声明一个不完整的类型之外,它将是无限的并且永远不会有足够的字节,因为您添加的每个实例也将需要一个实例。
使用指针没问题;然而,这种方法通常用于创建链表等。指针指向链中的下一个实例。
为什么我们在自引用结构中使用指针?它是强制性的还是非强制性的?如果不是,与普通结构定义相比,在结构中使用指向结构的指针有什么优势?
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
在物理上包含自己,则无法确定其大小,这是一个循环定义。
结构包含作为外部结构实例的成员是没有意义的。除了要求您声明一个不完整的类型之外,它将是无限的并且永远不会有足够的字节,因为您添加的每个实例也将需要一个实例。
使用指针没问题;然而,这种方法通常用于创建链表等。指针指向链中的下一个实例。