大家好,问一个c的free有关问题,它好像没有释放掉指针

大家好,问一个c的free问题,它好像没有释放掉指针
代码如下:

#include <stdio.h>

#include <stdlib.h>



struct test 

{

int a;

struct test *next;

};

int main()

{

struct test test0={10};

struct test *test1 = (struct test *)malloc(sizeof(struct test));

test1->a=20;

test1->next = &test0;

free(test1);

printf("%d %d",test1->a,(*test1->next).a); 

}

输出test1->a为0  ,(*test1->next).a为10


说明结构体里的变量a已经被free释放掉了,而test1里的指针变量next却还可以被访问??


------解决方案--------------------
free不是说马上清空那块内存,其结果是未定的。free只是说释放了引用,别的程序可以引用那块内存。
------解决方案--------------------
free释放了当前结构体所占的内存,即int a;但是结构体指针是不占内存的,他只是一个指针,所以不会被释放
------解决方案--------------------
free之后test1所指向的内存块已经被标志为空闲,也就是说其它代码段可以随时使用它了,因此一般的做法是free之后立马把test1赋为NULL,已经产生你代码所示的野指针行为。

引用:
代码如下:

#include <stdio.h>

#include <stdlib.h>



struct test 

{

int a;

struct test *next;

};

int main()

{

struct test test0={10};

struct test *test1 = (st……

------解决方案--------------------
free之后只是标示这块内存可以被内存管理模块回收并重新分配给其他使用者.但是这块内存仍然是可以使用的,因为你知道这块内存的地址.然而结果是不确定的.因此为了避免这种情况,一般来说free之后,立刻置为NULL.