2020年12月25日 / 1次阅读
CC++
稍微有点规模的C语言程序,都大量使用结构体struct这种类型的数据,而结构体之间的指针引用,几乎不可避免。本文总结自引用的结构体定义。
不使用typedef时
不使用typedef的时候,允许直接定义自引用的指针,但是不能定义自引用成员结构体。请看下面的错误:
struct tag{
struct tag A; /* Wrong:无限循环的结构体 */
int value;
};
这种声明是错误的,因为这实际上是一个无限循环,成员A是一个结构体,A的内部还会有成员是结构体,依次下去,无线循环。在分配内存的时候,由于无限嵌套,也无法确定这个结构体的长度,所以这种方式是非法的。
这种情况,只能使用指向结构体的指正,下面是正确的定义:
struct tag{
struct tag *A; /* Right */
int value;
};
指正的长度是确定的,以上定义合法可行。
使用typedef时
在使用typedef的时候,情况有一些不同。
先看错误的定义:
typedef struct tag{
Node *A; /* Wrong:Node is undefined here */
int value;
} Node;
以上定义,使用了指针,但是还是错的,因为typedef将 struct tag 重命名为 Node,但是在这个结构体内部,Node属于未定义。
正确的定义方式如下:
typedef struct tag{
struct tag *A; /* Right by using original name */
int value;
} Node;
总结一下:定义自引用的结构体,使用指向原名称的指针!
本文链接:https://www.maixj.net/ict/self-referential-struct-24250
©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。