free()函数

zhufeiguanghui 2010-02-05 03:23:34
为什么下面的程序能执行啊?
char *str = (char *) malloc(100);
strcpy(str,"hello");
free(str);
if(str != NULL)
{
strcpy(str,"world");
}
...全文
180 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
布拉格曼 2010-02-06
  • 打赏
  • 举报
回复
用这个修改的语句试一试?
char *str = (char *) malloc(100*sizeof(char));

free(str);应该放在最末的return 之前吧。
olla168 2010-02-05
  • 打赏
  • 举报
回复
char *str = (char *) malloc(100); 
strcpy(str,"hello");
free(str); //这只是将str指向的内存归还给系统,但并未切断str与那段内存间的联系;
//在这里增加str = NULL;下面的if语句将不会被执行

if(str != NULL)
{
strcpy(str,"world");
}
swl82560397pq 2010-02-05
  • 打赏
  • 举报
回复
前面几位已经回答正确了
hbuxiaoshe 2010-02-05
  • 打赏
  • 举报
回复
char *str = (char *) malloc(100);
这句在堆上申请了一个大小为100的空间,该空间的首地址存放在变量str上,而str则存放在栈上。
free()只释放了堆上的空间,而str还存在。
z412051192 2010-02-05
  • 打赏
  • 举报
回复
为什么下面的程序能执行啊?
char *str = (char *) malloc(100);
strcpy(str,"hello");
free(str);
//free这句话的意思是告诉操作系统(现在释放这块地址,为空闲态),以后再出现malloc函数这块地址可能会被分配,str的值是不会变的。还是原来malloc的返回值。
if(str != NULL)
{
strcpy(str,"world");
}
你这段代码是可以编译通过的。可以执行的。
zjf30366 2010-02-05
  • 打赏
  • 举报
回复
恩[Quote=引用 12 楼 huadust 的回复:]
楼上说的综合一下,相信楼主就能理解了.
[/Quote]
huadust 2010-02-05
  • 打赏
  • 举报
回复
楼上说的综合一下,相信楼主就能理解了.
fo1_sky 2010-02-05
  • 打赏
  • 举报
回复
free后马上把指针设为NULL,养成一个好的习惯
xboy 2010-02-05
  • 打赏
  • 举报
回复
to:AzraeLN
你调试一下free
nobody@noone 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xboy 的回复:]
free真的释放内存了么?
其实没有的,他们没有将目标内存的值清零
他只是告诉操作系统,目前我指向的这块内存我不要了,你爱拿去干嘛就拿去干嘛。

这也是为什么所有的教科书上都强调:free(str)之后,一定要用str=NULL;
如果你不调用free(str)然后,直接让str=NULL呢?这样也行,但是操作系统就不会把str原来指向的内存回收了,也就是说浪费了一块内存。
简而言之,free就是告诉操作系统,现在这个指针指向的内存您拿走,我不要了
[/Quote]
也不一定,vc我印象是整成0xCD的
lvp1984 2010-02-05
  • 打赏
  • 举报
回复
操作野指针, 具体为什么能执行不报错就得看看系统判断段错误到底根据什么,可参考
http://www.linuxsir.org/bbs/archive/index.php/t-132559.html
xboy 2010-02-05
  • 打赏
  • 举报
回复
free真的释放内存了么?
其实没有的,他们没有将目标内存的值清零
他只是告诉操作系统,目前我指向的这块内存我不要了,你爱拿去干嘛就拿去干嘛。

这也是为什么所有的教科书上都强调:free(str)之后,一定要用str=NULL;
如果你不调用free(str)然后,直接让str=NULL呢?这样也行,但是操作系统就不会把str原来指向的内存回收了,也就是说浪费了一块内存。
简而言之,free就是告诉操作系统,现在这个指针指向的内存您拿走,我不要了
macrojj 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhufeiguanghui 的回复:]
为什么下面的程序能执行啊?
char *str = (char *) malloc(100);
strcpy(str,"hello");
free(str);
if(str != NULL)使用已经回收的内存 这块数据会被其他东西改变 可能很幸运你此时没发现他改变
{
  strcpy(str,"world");
        }
[/Quote]
challenge99 2010-02-05
  • 打赏
  • 举报
回复
free过后,只表明该空间可以再次被利用, 是不是马上回收依赖系统的实现
yitaohust 2010-02-05
  • 打赏
  • 举报
回复
所以一般frre(str)后面,都继续跟上一个操作:str = NULL,就是把str指针回归内存起点,指向内存的0位置,这样就不会给以后的操作带来隐患了,不会指到不属于你的内存上了。
stardust20 2010-02-05
  • 打赏
  • 举报
回复
上面找错了。。是他并不总是能执行。。
stardust20 2010-02-05
  • 打赏
  • 举报
回复
free(str);
并不会把指针str=NULL;
strcpy(str,"world");
然后你再去访问已经释放的内存是非法的。。。
他并总是能执行。。而且是危险的。。
yitaohust 2010-02-05
  • 打赏
  • 举报
回复
free()函数只是切断了指针str和那块内存区的关联,而指针str本身却还是存在的
所以你在拷贝world过去,编译器不会报错的。但最后的内容,那就不能保证了。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧