c语言定义一个结构体指针变量跟定义该指针变量之后再调用malloc为其分配内存之后有什么不同?

例如:
struct student *p1 和 struct student *p2; p2=(struct student *)malloc(sizeof(struct student));
这里的p1和p2只是为了区别两种情况而命名的,原本的问题是因为看到有的关于链表的基本操作代码中给出了在链表中可以定义一个 没有采用malloc分配内存的指针变量p1,去访问链表中的结点,实现p1->next等操作,不太理解一个指针变量用malloc分配了内存和不用malloc的区别所在

你的“分配内存”的概念有点问题——不是用malloc为某个指针分配了内存,而是先用malloc分配了内存,再将这个块内存的首地址赋给一个类型匹配的指针,把首地址赋给一个指针的目的是为了操作这一块内存,否则分配在什么地方你就不知道了,就无法操作和释放这一块内存了。根据上述解释,那么再声明另一个类型匹配的指针,通过已有的指针关系就可以访问前面由malloc申请的内存空间了。这就像int *p,a;p=&a;int *q;q=p;,结果p和q就都指向了a,*p是a,*q也是a;(*p)++;能使a增1,(*q)++;同样能使a增1;这有什么不妥?你可以把a比作由malloc分配的内存,并用p=&a把地址赋给了p;而q是与a毫无关系的类型与p一样的指针,只要一句q=p;不就把q与a也联系起来了吗?供参考。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-24
其本质实是没有区别的。都是这种类型的指针。
唯一的区别在于。p1不指向任何地址。p2指向了某段有效的内存。
链表中,定义一个指针,是为了让其记录下首地址,遍历完成后,head依然是head,不然的话,你用head去遍历,到最后 你就只剩下一个节点了 。 防止内存泄漏。本回答被网友采纳
相似回答