结构的自引用
(1)
struct SELF_REF1
{
int a;
struct SELF_REF1 b;
int c;
};
这种类型的自引用是非法的,有点像永不终止的递归程序。
(2)
struct SELF_REF2
{
int a;
struct SELF_REF2 *b;//递归型结构,必须用指针来声明。
int c;
};
这个声明和前面的声明的区别在于b现在是一个指针而不是结构。
编译器在结构的长度确定之前就已经知道指针的长度,所以这种类型的自引用是合法的。
事实上它所指向的是同一类型的不同结构,更加高级的数据结构,如链表和树,都是用
这种技巧实现的,每隔结构指向链表的下一个元素或树的下一个分支。
(3)【警告】
警惕这个陷阱:
typedef struct
{
int a;
SELF_REF3 *b;
int c;
}SELF_REF3;
这个声明的目的是为这个结构创建类型名SELF_REF3,但是它失败了,类型名直到的末尾
才定义,所以在结构声明的内部它尚未定义。
解决方案是定义一个结构标签来声明b,如下
typedef struct SELF_REF3_TAG
{
int a;
struct SELF_REF3_TAG *b;//必须同时出现在同一行
int c;
}SELF_REF3;