【 C 】结构的自引用
【摘要】 在学习链表的时候用到了结构的自引用,这里学习一下:
《C和指针》对结构的自引用的分析还比较清晰!这里做笔记记录下:
在一个结构内部包含一个类型为该结构体本身的成员是否合法呢?下面给出一个例子,仅供判断:
struct SELE_REF1 { int a; struct SELF_REF1 b; int c;}
这种类型的自引用是非法的,因为成员b是另一个完整的结构,...
在学习链表的时候用到了结构的自引用,这里学习一下:
《C和指针》对结构的自引用的分析还比较清晰!这里做笔记记录下:
在一个结构内部包含一个类型为该结构体本身的成员是否合法呢?下面给出一个例子,仅供判断:
struct SELE_REF1 {
int a;
struct SELF_REF1 b;
int c;
}
这种类型的自引用是非法的,因为成员b是另一个完整的结构,其内部还将包含它自己的成员b。这样重复下去永无止境。这有点像永不会终止的递归程序。
但下面的这个声明是合法的:
struct SELF_REF2{
int a;
struct SEF_REF2 *b;
int c;
}
那为什么这个声明就是合法的呢?
这个声明和上面那个声明的区别就是b现在是一个指针而不是结构。编译器在结构的长度确定之前就已经知道指针的长度,所以这种类型的自引用是合法的。
警惕这个陷阱:
typedef struct {
int a;
SELF_REF3 *b;
int c;
} SELF_REF3;
这个声明的目的是为这个结构创建一个类型名SELF_REF3。但是它失败了,原因是类型名直到声明的末尾才定义,所以在结构声明的内部它尚未定义,怎么就可以使用了呢?
解决方案是定义一个结构标签来声明b,如下:
typedef struct TAG{
int a;
struct TAG *b;
int c;
} SELF_REF3;
这样才是没有问题的!
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/82632806
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)