#include<stdio.h>
#include<stdlib.h>
int main(){
int *test=(int *)calloc(1,sizeof(int));
if(!test)
printf("分配内存错误/n");
else{
printf("指针地址:%X/n",(unsigned int)test);
printf("指向内存的内容:%d/n",*test);
printf("释放它/n");
free(test);
printf("释放后,指针的地址:%X/n",(unsigned int)test);
printf("释放后,指针指向的内存的内容:%d/n",*test);
}
return 0;
}
通过上面的小程序,可以看出,在free前后,指针test并没有改变,那么free到底怎么工作呢?
查看man 3 free,其中也没有说明白,只是说free释放掉指定参数指针指向的内存,并返回void。其实,free函数只是将参数指针指向的内存归还给操作系统,并不会把参数指针置NULL,为了以后访问到被操作系统重新分配后的错误数据,所以在调用free之后,通常需要手动将指针置NULL。从另一个角度来看,内存这种底层资源都是由操作系统来管理的,而不是编译器,编译器只是向操作系统提出申请。所以free函数是没有能力去真正的free内存的。只是告诉操作系统它归还了内存,然后操作系统就可以修改内存分配表,以供下次分配。