一道中兴试题的解析

void Test(void)
{

char *str = (char *) malloc(100);

strcpy(str, “hello”);

free(str);

if(str != NULL)

{

strcpy(str, “world”);

printf(str);

}

}

请问运行Test函数会有什么样的结果?

答:篡改动态内存区的内容,后果难以预料,非常危险。

因为free(str);之后,str成为野指针,

if(str != NULL)语句不起作用。


上面是所给答案,不知道对不对啊!但运行该程序,我总能得到结果,“world”,why,明明我已释放内存了啊?我借助强大的网路,找到了答案!有人说这样做是靠人品吃饭!呵呵!蛮对的啊!

是这样的:系统只是将指针指向的堆空间回收,但是没有将指针变量的值赋值为null,也就是说指针还是指向原来的堆空间,指针没有摧毁,但是这个空间已经失效

所以free(delete)一个指针以后要马上将它赋值为null不然容易导致野指针的出现....,你释放内存后,告诉了os,这块内存我不用了,你可以分配给其他人了,如果str没有指0,下次os将该内存给别人,那结果就危险了!!

如果不考虑多任务或多线程的影响(即紧跟在delete或free后不会发生其它任务或线程调用new或malloc之类的在堆上分配内存的函数),这个写法是可以的。

当然最好还是不要这样写。

参考 讨论结果:http://topic.csdn.net/u/20100426/12/765d0583-17cc-44ff-9fb7-1200cda5e436.html

中兴试题全集:http://user.qzone.qq.com/914122137?ptlang=2052&ADUIN=498527489&ADSESSION=1316307609&ADTAG=CLIENT.QQ.3307_FriendInfo_PersonalInfo.0 不可随便留言,我在网上看到了,非本人!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值