c语言 free

我有这样一段程序;
typedef struct polynode
{ int num;
struct polynode *next;
}poly;
.
.
.
while(p->next!=NULL)
{free(p);
p->next=NULL;
}
请问 为什么没有错误。把地址P指向空间释放掉,那么p->next这一步为什么还能操作。
又p->next是存放在p所指向的空间里面吗?
如果p=NULL; 那么可以访问到p->next吗 是不是p->next==NULL.
为什么没有错误。把地址P指向空间释放掉,那么p->next这一步为什么还能操作。又p->next是存放在p所指向的空间里面吗?
答:因陵败为你没有释放p,p!=NULL,只是释放了p->next所指向的内存,p->next = NULL,所以还能操作。看结构定义,p->next这个指针是存放在p所指向的空间里面。

如果p=NULL; 那么可以访问到p->next吗 是不是p->next==NULL.
答:不可以,指尺兄颤针必须指向尘前一个结构,才能够引用结构的next指针。一般循环释放内存应该这样子。
while(p!=NULL)
{
temp = p;
p = p->next;
free(temp);
}
free(p)是告野毕雹诉系统前面申请的p指向的这个内存块已经不用,可以释放,但是p依然还是指向该内存的地址,因此,p->next=NULL; 也会把p->next指向的数据修改。

虽颂帆然你这数返样做是错误的,但是由于语法上没问题,编译器无法检查出来,因此在free(p)后应该把p赋值为NULL
free之后是p=NULL吧。
把地址P指向空间释放掉,P就不指向任何地址了,当然也不指向next了,所以出错