这个问题是我在2020年刚开始学数据结构链表那一章遇到的,当时应该也没完全理解透彻,然后最近又遇到了,重新了解了一下。感觉网上许多人说的也未必正确,所以跟大家讲讲我的看法。
先得有两个知识前提:
1.首先是关于变量的内存分配问题。对于c里面自带的数据类型,只有定义和赋值两个环节,对于自定义的数据类型如struct,enum,union等,有声明,定义,赋值三个环节。然而变量的内存分配只在定义的时候进行。
2.再是指针的问题,指针是一种c自带的数据类型,指针自己的空间在定义指针变量的时候就会分配(如:int *p,struct LNode *p),然后就只剩下指针的赋值。它的赋值应当是一个内存空间当中的地址。
结论:结构体指针变量申请空间实质上不是给指针申请空间,因为指针在定义的时候就已经分配了内存,他有了空间了。实质上是相当于分配了一个结构体大小的内存在堆区里面给一个无名结构体,然后用这个结构体的初始地址给指针赋值。
malloc函数原型: void malloc(unsigned int size); //返回值是指向分配空间的首地址的指针
p=(struct LNode)malloc(sizeof(struct LNode);