C语言中free掉一段空间后为什么还要使用NULL

free(temp);//其中temp是一个指针temp=NULL;请高手解释,如何验证解释的正确性,专业解释,非懂勿进,谢谢配合!... free(temp);//其中temp是一个指针
temp=NULL;
请高手解释,如何验证解释的正确性,专业解释,非懂勿进,谢谢配合!
展开
 我来答
zyl0462
2015-06-03 · TA获得超过1082个赞
知道小有建树答主
回答量:433
采纳率:75%
帮助的人:325万
展开全部
指针free之后,free函数只是把指针指向的内存空间释放了,即内存中存储的值,但是并没有将指针的值赋为NULL,指针仍然指向这块内存。而程序判断一个指针是否合法,通常都是使用if语句测试该指针是否为NULL来判断,导致指针成为所谓的“野指针”,诱导误操作,示例代码如下,
#include <stdio.h>
#include <malloc.h>
int main(int argc, char *argv[])
{
int *p=NULL;
p=(int *)malloc(sizeof(int));
*p=400;
printf("free前,%d\n",*p);//输出400
free(p);
if(p!=NULL)
printf("free后,未设置NULL,%d\n",*p);//可能输出1497144或其他的垃圾值
return 0;
}

“野指针”与空指针不同,“野指针”有地址,或者说指向指定的内存,对野指针进行操作很容易造成内存错误,破坏程序数据等危险。“野指针”无法简单地通过if语句判断其是否为 NULL来避免,而只能通过养成良好的编程习惯来尽力减少,free函数执行后,一定要接着设置指针为NULL。
沧海雄风2009
2013-08-05 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2753万
展开全部
“野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。有个良好的编程习惯是避免“野指针”的唯一方法。

指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

例:
free( p );
if ( p != NULL )
p = NULL;
追问
int *p=NULL;
*p=9;
试了一下发生了段错误,这个如何理解?
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
王囧囧1988
2013-08-05 · TA获得超过132个赞
知道小有建树答主
回答量:85
采纳率:0%
帮助的人:109万
展开全部
free函数只是释放掉了指针所指向的那一段内存空间,但释放后指针本身的值仍然保持,需要显式的置0。这么做是有必要的,一般是结合代码其它部分的参数检查:当别处需要使用temp却发现temp为null时,就会进行相应的处理(报错或者malloc等等),而不会直接导致严重错误或者程序崩溃的出现。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yuantailing
2013-08-05 · TA获得超过2545个赞
知道小有建树答主
回答量:1167
采纳率:92%
帮助的人:642万
展开全部
temp=NULL并不需要,它只是为了安全,避免野指针。

如果你以后还通过temp指针访问其值,如果没有执行过temp=NULL;那么程序很可能就默默地错误地执行下去了,是一种隐患;如果执行过temp=NULL;,程序一定会报一个错误,说指向0x00000000的内存不能为read。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zjfaok
2013-08-05 · TA获得超过6805个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1567万
展开全部
万一忘记了在这个地方已经free过temp了(当代码很长并且比较复杂的时候极有可能),再一次free(temp)就会导致异常,而free(NULL)是不会有效果的……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式