我是靠谱客的博主 优美蜻蜓,最近开发中收集的这篇文章主要介绍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;

>>>>>>>;

};



最后

以上就是优美蜻蜓为你收集整理的c 结构体的嵌套引用解读的全部内容,希望文章能够帮你解决c 结构体的嵌套引用解读所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部