C语言中新定义的结构体节点如何内部引用自身?struct自引用问题
C语言结构体自引用指针的逻辑说明
你给出的是C语言中非常典型的结构体自引用写法,具体解释如下:
你提供的代码示例:
struct n { int data; struct n *next ; };
具体含义
这里的struct n *next是在结构体内部声明了一个指向同类型结构体实例的指针,这种写法最常见的用途是构造链表、二叉树这类需要关联多个同类型节点的数据结构。
实现逻辑
- C编译器处理结构体定义是分步骤的:当解析到
struct n {这行时,就已经将struct n标记为一个合法的结构体类型名,只是还没有完成该结构体的大小计算、所有成员的定义工作。 - 我们在这里声明的是指针类型的成员,而非结构体变量:不管是什么类型的指针,在固定的编译环境下占用的内存大小是固定的(32位环境下占4字节,64位环境下占8字节),编译器不需要知道
struct n的完整大小,就能确定next指针要占多少内存,所以可以正常编译通过。 - 如果把代码改成
struct n next就会直接报错:这种写法相当于在结构体内部嵌套一个同类型的结构体变量,编译器需要先算出struct n的大小才能给内部的next变量分配空间,但内部的next变量本身也是struct n类型,会陷入无限递归的定义死循环,根本无法计算大小。
实际用途
这个next指针可以存储另一个struct n类型节点的内存地址,就能把多个独立的结构体节点串联起来。比如构造单链表时,每个节点的next都指向链表中的下一个节点,我们只需要保存链表头节点的指针,就能遍历到整个链表的所有节点。
内容的提问来源于stack exchange,提问作者EBG
相关产品推荐
相关产品推荐

