【 C 】结构的自引用

举报
李锐博恩 发表于 2021/07/15 06:11:45 2021/07/15
【摘要】 在学习链表的时候用到了结构的自引用,这里学习一下: 《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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。