C语言中free掉一段空间后为什么还要使用NULL
free(temp);//其中temp是一个指针temp=NULL;请高手解释,如何验证解释的正确性,专业解释,非懂勿进,谢谢配合!...
free(temp);//其中temp是一个指针
temp=NULL;
请高手解释,如何验证解释的正确性,专业解释,非懂勿进,谢谢配合! 展开
temp=NULL;
请高手解释,如何验证解释的正确性,专业解释,非懂勿进,谢谢配合! 展开
5个回答
展开全部
指针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。
#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。
展开全部
“野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。有个良好的编程习惯是避免“野指针”的唯一方法。
指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
例:
free( p );
if ( p != NULL )
p = NULL;
指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
例:
free( p );
if ( p != NULL )
p = NULL;
追问
int *p=NULL;
*p=9;
试了一下发生了段错误,这个如何理解?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
free函数只是释放掉了指针所指向的那一段内存空间,但释放后指针本身的值仍然保持,需要显式的置0。这么做是有必要的,一般是结合代码其它部分的参数检查:当别处需要使用temp却发现temp为null时,就会进行相应的处理(报错或者malloc等等),而不会直接导致严重错误或者程序崩溃的出现。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
temp=NULL并不需要,它只是为了安全,避免野指针。
如果你以后还通过temp指针访问其值,如果没有执行过temp=NULL;那么程序很可能就默默地错误地执行下去了,是一种隐患;如果执行过temp=NULL;,程序一定会报一个错误,说指向0x00000000的内存不能为read。
如果你以后还通过temp指针访问其值,如果没有执行过temp=NULL;那么程序很可能就默默地错误地执行下去了,是一种隐患;如果执行过temp=NULL;,程序一定会报一个错误,说指向0x00000000的内存不能为read。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
万一忘记了在这个地方已经free过temp了(当代码很长并且比较复杂的时候极有可能),再一次free(temp)就会导致异常,而free(NULL)是不会有效果的……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询