关于结构体自我嵌套的理解

数据结构中链表的结构体

typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LinkNode;

其中struct LNode* next应理解为一种struct LNode类型的指针,它存放的是指向下一个struct LNode类型的地址,因为指针的赋值必须类型是相同的,比如:

int a = 6;
double* p = &a;

这种赋值是错误的,指针的赋值必须和a都是相同类型的数据,所以想要指向下一个相同结构体必须定义为struct LNode* next的形式。

关于空间的分配

LinkNode ss = { 10 };
printf("%p\n", &ss.data);//00EFFB24
printf("%p\n", &ss.next);//00EFFB28
ss.next = (LinkNode*)malloc(sizeof(LinkNode));
printf("-----------------------------------------\n");
printf("%p\n", &ss.next);//00EFFB28

在ss初始化的时候ss.next就已经分配了空间,相当于给了ss一个malloc,ss.next里面应当存放一个struct LNode的地址。

但是他是不是不断地套娃循环?

LinkNode ss = { 10 };
printf("%p\n", &ss.data);//0073FAB8
printf("%p\n", &ss.next);//0073FABC
printf("-----------------------------------------\n");
printf("%p\n", &ss.next->data);//00000000
printf("%p\n", &ss.next->next);//00000004
printf("-----------------------------------------\n");
printf("%p\n", &ss.next->next->data);
printf("%p\n", &ss.next->next->next);
printf("-----------------------------------------\n");
printf("%p\n", &ss.next->next->next->data);
printf("%p\n", &ss.next->next->next->next);

在仅初始化ss不给ss.next使用malloc时,ss.next->next地址是有问题的,之后两个都没有输出

LinkNode ss = { 10 };
printf("%p\n", &ss.data);//00B3FE44
printf("%p\n", &ss.next);//00B3FE48
printf("-----------------------------------------\n");
ss.next = (LinkNode*)malloc(sizeof(LinkNode));
printf("%p\n", &ss.next->data);//00C04BD8
printf("%p\n", &ss.next->next);//00C04BDC
printf("-----------------------------------------\n");
printf("%p\n", &ss.next->next->data);//CDCDCDCD
printf("%p\n", &ss.next->next->next);//CDCDCDD1
printf("-----------------------------------------\n");
printf("%p\n", &ss.next->next->next->data);
printf("%p\n", &ss.next->next->next->next);

初始化ss,给ss.next使用malloc后,可以看到ss.next->next是有空间分配且正常,而ss.next->next->next地址有问题,但是ss.next->next->next->next并没有输出

LinkNode ss = { 10 };
printf("%p\n", &ss.data);//00CFF778
printf("%p\n", &ss.next);//00CFF77C 
printf("-----------------------------------------\n");
ss.next = (LinkNode*)malloc(sizeof(LinkNode));
printf("%p\n", &ss.next->data);//00FF4BD8
printf("%p\n", &ss.next->next);//00FF4BDC
printf("-----------------------------------------\n");
ss.next->next = (LinkNode*)malloc(sizeof(LinkNode));
printf("%p\n", &ss.next->next->data);//00FF4C10
printf("%p\n", &ss.next->next->next);//00FF4C14
printf("-----------------------------------------\n");
printf("%p\n", &ss.next->next->next->data);//CDCDCDCD
printf("%p\n", &ss.next->next->next->next);//CDCDCDD1
printf("-----------------------------------------\n");
printf("%p\n", &ss.next->next->next->next->data);
printf("%p\n", &ss.next->next->next->next->next);

给ss.next->next一个malloc,可以看到ss.next->next->next的地址为正常的,而ss.next->next->next->next不并不正确,更后面的依旧没有输出

以上可以看出结构体的自我嵌套并不会无尽的套娃,而是需要手动对当前next进行一次初始化或malloc之后,才会创建一个相同类型的结构体

上一篇:latex算法模板


下一篇:数的读法