C语言—结构体不能直接包含自身作为成员,但可以包含指向其自身类型的指针。

在C语言中,结构体不能直接包含其自身作为成员,因为这将导致结构体大小无限大。然而,结构体可以包含指向其自身类型的指针。这种特性使得结构体能够间接地引用或链接到同类型的其他实例,这是构建链表、树和其他递归数据结构的基础。

结构体不能直接包含其自身作为成员

当我们说结构体不能直接包含其自身作为成员时,意思是你不能在一个结构体定义中直接包含该结构体类型的另一个完整实例。如果这样做了,就会导致结构体的大小变得无限大,因为每个实例都将包含另一个同样大小的实例,而这是不可能的。

为什么不可行

考虑以下尝试定义:

typedef struct ImpossibleNode {
    int data;
    struct ImpossibleNode node; // 这是不允许的
} ImpossibleNode;

在这个例子中,ImpossibleNode 结构体试图包含另一个 ImpossibleNode 类型的 node 成员。这是不允许的,因为每个ImpossibleNode实例都要包含另一个完整的ImpossibleNode 实例,这个嵌套是无限的。

正确的做法:使用指针

正确的方法是在结构体内部包含一个指向同一类型的指针,而不是直接包含另一个实例。这样的定义允许结构体实例通过指针相互引用,而不会导致大小问题。

typedef struct Node {
    int data;
    struct Node* next; // 这是允许的
} Node;

在这个定义中,Node 包含了一个指向另一个 Node 实例的指针 next。这样,每个 Node 实例的大小是固定的,不会因为嵌套而增长。

为什么说“每个 Node 实例的大小是固定的,不会因为嵌套而增长。”

在C语言中,结构体的大小是其所有成员大小之和。对于 Node 结构体,它有两个成员:

  • 数据成员(例如 int data):这个成员的大小是固定的,取决于其类型(在这个例子中,是 int 的大小)。
  • 指针成员(例如 struct Node* next) :指针的大小也是固定的,并且与指针所指向的数据类型无关。无论指向什么类型,所有指针的大小在特定平台上都是一样的(例如,在32位系统上通常是4字节,在64位系统上是8字节)。

因此,不论 Node 结构体实例的数量或如何相互链接,每个实例的内存大小都是一致的,由其数据成员和指针成员的大小决定。这与结构体实例是否包含其他实例或如何嵌套无关,因为嵌套是通过指针实现的,而不是通过直接包含另一个结构体实例。

你可能感兴趣的:(C&C++,c语言,开发语言,链表)