C语言中的结构自引用和交叉引用

电脑杂谈  发布时间:2020-05-13 09:13:36  来源:网络整理

结构体_树体结构_日报体结构

结构的自引用(自我引用),位于结构内部,包含指向其自身结构的指针

结构的相互引用,即多个结构包含指向其他结构的指针.

1.1不使用typedef时

结构体_日报体结构_树体结构

错误的方式:

1 struct tag_1{
2     struct tag_1 A;   /* 结构体 */
3     int value;
4 };

这种声明是错误的,因为这种声明实际上是一个无限循环,成员b是一个结构结构体,并且在b的结构内部将有一个成员,进而是无线循环. 分配内存时,由于无限嵌套而无法确定此结构的长度结构体,因此此方法是非法的.

结构体_树体结构_日报体结构

正确的方法: (使用指针):

1 struct tag_1{
2     struct tag_1 *A;  /* 指针 */
3     int value;
4 };

由于确定了指针的长度(在32位计算机上,指针的长度为4),因此编译器可以确定结构的长度.

日报体结构_树体结构_结构体

1.2使用typedef时

错误的方式:

1 typedef struct {
2     int value;
3     NODE *link;  /* 虽然也使用指针,但这里的问题是:NODE尚未被定义 */
4 } NODE;

树体结构_日报体结构_结构体

此处的目的是使用typedef为该结构创建别名NODEP. 但这是错误的,因为类型名称的范围从语句的末尾开始,并且由于尚未定义,因此不能在结构内部使用.

正确的方法: 有三种,相差不大,可以使用任何一种.

 1 /*  方法一  */
 2 typedef struct tag_1{
 3     int value;
 4     struct tag_1 *link;  
 5 } NODE;
 6 
 7 
 8 /*  方法二  */
 9 struct tag_2;
10 typedef struct tag_2 NODE;
11 struct tag_2{
12     int value;
13     NODE *link;    
14 };
15 
16 
17 /*  方法三  */
18 struct tag_3{
19     int value;
20     struct tag *link;  
21 };
22 typedef struct tag_3 NODE;

错误的方式:

1 typedef struct tag_a{
2     int value;
3     B *bp;  /* 类型B还没有被定义 */
4 } A;
5 
6 typedef struct tag_b{
7     int value;
8     A *ap;
9 } B; 

错误原因与上面相同,其中在定义类型B之前就使用了它.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-208467-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...