c 结构体的嵌套引用解读

c  结构体的嵌套引用解读

背景:在Linux内核系统中经常能看到如下例1形式的结构体嵌套引用,在代码追踪、走读的时候令人费解。所以在弄清楚结构体的嵌套调用就很有用处了。

概念: 

                 1、结构的自引用

        在一个结构内部包含一个类型为该结构体自身的成员是不合法的。

如下: 

struct SELF_REF1 {

int  a;

struct  SELF_REF1 b;

int  c;

};

引用成员b是另一个完整的结构,其内部还将包含它自己的成员b,这第二个成员又包含一个完整的结构,它还将包括它自己的成员b,这样重复下去永无休止。所以        不合法。

      那么要如何引用自身结构呢,可以使用结构体指针的方式,如下:

      struct  SELF_REF2 {

int a;

           struct  SELF_REF2 *b;

int c;

}

 这个声明和前面那个声明的区别是b现在时一个指针,而不是结构;编译器在结构的长度确定之前就已经知道指针的长度,所以这种自引用是合法的。

结构体的自引用在实现链表,树等高级的操作时用处很大。

注意:

在使用过程中可能出现如下的声明,是不合法的:

typedef struct {

int a;

SELF_REF3 *B;

int c;

}SELF_REF3;

这个声明的目的是为这个结构创建类型名SELF_REF3,但是失败了,类型名直到声明的末尾在定义,所以在结构声明的内部它尚未定义。

                        要解决可以用如下方式:

typedef struct  SELF_REF3_TAG {

int a;

struct SLEF_REF3_TAG *b;

int c;

}SELF_REF3;

 

2、嵌套引用

在linux 内核中,经常能看到数据结构之间存在依赖关系。也就是说、其中一个结构包含了另一个结构的一个或者多个成员。和自引用一样,至少有一个结构必须在另一个结构的内部以指针的形式存在。

问题:如果每个结构体都引用了其他结构的标签,哪个结构应该首先声明呢?

这个问题必须实现不完整声明,它声明一个作为结构体标签的标识符。然后我们可以把这个标签用在不需要知道这个结构长度的声明中,如声明指向这个结构体的指针。

例:

struct B;

                

struct A {

struct B *partner;

>>>>>

};

struct B {

struct A *partner;

>>>>>>>;

};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值