在C 语言中 在时候用完malloc()等动态分配的函数之后要 释放该段内存 就要用到 free()函数了,但是该函数有一个特点,就是用完之后,它并不会把指针指向空,只是告诉OS 被以前 malloc 函数 征用的 那段内存 可以再次被 其它 进程 使用了,但是被 free的指针仍指向 该段内存,这个时候这个指针通常被称为 野指针 。 所以要特别注意。
举例如下 :
假设
char *p=malloc(sizeof(char)); 之后p的值是地址0x00000001
*p = 'a'; //在地址0x00000001中写入'a';
free(p); //将不再能通过p来访问地址0x00000001,如果通过p来访问地址0x00000001的话既视为非法操作
*p = 80; //这里通过p往地址0x00000001中写入80,如上所述,已经free过,这么做是非法的
你 可以想象这样一种情况,在执行free(p)之后,地址为0x00000001的内存就自由了,系统或者程序在其他地方征用了(譬如使用malloc)地 址0x00000001作为一个存储备份值的地方,而且往里面写入了一个值,假设是200,但是你下面又通过*p = 80;改变了地址0x00000001中的值,本来备份的是200,你非法地改成了80,那么目前拥有地址0x00000001使用权的系统或者程序就会 读取到错误的备份值,本来是200的,现在变成了80,从而会出错。
因此有个代码规则是在free(p)之后将p = NULL;
即 free(p);
p = NULL;
在代码中是要 一块出现 的,就是为了刻意的防止进行 *p 操作。
且记,且记