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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小菜鸟moon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值