加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

指针free后仍能赋值,why?

(2012-06-08 04:44:06)
标签:

杂谈

指针free后仍能赋值,why?《高质量C/C++编程指南》里面有一段程序,说是指针free掉后如果不赋空的话会出问题,但我再gcc里面编译后运行没有任何问题,*p的值为“world”,调试发现p的地址free后没变,内容变成了“\0”,不是垃圾信息。why ? 代码:

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

strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变



if(p != NULL) // 没有起到防错作用
{
strcpy(p, “world”);// 出错
}

[ 本帖最后由 eliry 于 2007-9-28 14:43 编辑 ]free是个函数http://www.crewsfx.com/,当然不会改变参数的值。原帖由 eliry 于 2007-9-28 14:40 发表 http://bbs.chinaunix.net/images/common/back.gif
《高质量C/C++编程指南》里面有一段程序,说是指针free掉后如果不赋空的话会出问题,但我再gcc里面编译后运行没有任何问题,调试发现p的地址free后没变,内容变成了“\0”,不是垃圾信息。why ?
char *p...

没出现问题不代表没有问题,你想啊,指针的空间已经释放了,你在给他赋值还有意义吗?
之所以出现你所谓的操作现象,是因为程序后面的操作可能还没有覆盖这个空间。这样对指针的操作很危险,尤其是一个大的程序。原帖由 emacsnw 于 2007-9-28 14:42 发表 http://bbs.chinaunix.net/images/common/back.gif
free是个函数,当然不会改变参数的值。

关键是free后对应的内存并不是所谓的垃圾内存,而是"\0",而且还能继续strcpy向里面填字符串,并没有成为“野指针”啊。原帖由 eliry 于 2007-9-28 14:47 发表 http://bbs.chinaunix.net/images/common/back.gif


关键是free后对应的内存并不是所谓的垃圾内存,而是"\0",而且还能继续strcpy向里面填字符串,并没有成为“野指针”啊。
原帖由 Godbach 于 2007-9-28 14:45 发表 http://bbs.chinaunix.net/images/common/back.gif


没出现问题不代表没有问题,你想啊,指针的空间已经释放了,你在给他赋值还有意义吗?
之所以出现你所谓的操作现象,是因为程序后面的操作可能还没有覆盖这个空间。这样对指针的操作很危险,尤其是一个大的 ... 原帖由 eliry 于 2007-9-28 14:47 发表 http://bbs.chinaunix.net/images/common/back.gif


关键是free后对应的内存并不是所谓的垃圾内存,而是"\0"http://www.yland.net/,而且还能继续strcpy向里面填字符串,并没有成为“野指针”啊。

野指针的说法主要是在你把一个

找工作还不如一个高中生?

指针free之后,还去解引用这个指针,这是我们称该指针为野指针,对程序是没有好处的。如果你不在解引用这个指针,也就无所谓了。
所以说在free(p)之后,
p = NULL
这样可以在你后面如果误操作该指针的时候,你自己可以知道指针以释放。不然,你做
if(p == NULL){}
判断时,该条件并不成立。进而的解引用就可以破坏你的程序了。原帖由 Godbach 于 2007-9-28 14:45 发表 http://bbs.chinaunix.net/images/common/back.gif


没出现问题不代表没有问题,你想啊,指针的空间已经释放了,你在给他赋值还有意义吗?
之所以出现你所谓的操作现象,是因为程序后面的操作可能还没有覆盖这个空间。这样对指针的操作很危险,尤其是一个大的 ...

Godbach回复真快,向你学习啊!最近找工作面试这些东西得好好学一遍了。呵呵,我也是之前遇到过这样的问题。高质量C编程这几个题好像是最容易被一些公司拿来当面试题的。另外,LZ也可以看看《C和指针》这本书,对指针讲的相当清楚.记死了!
堆空间一旦释放,不准再以任何方式引用!谢谢你,JohnBull版主!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有