free()的问题 释放内存空间

alexander068 2007-11-05 05:22:46
#include<stdio.h>
main()
{
char *str=NULL;
str=(char*)malloc(100);
strcpy(str,"abc");
printf("%s\n",str);
free(str);
printf("%s\n",str);
getch();
}

我运行的结果是:
abc
abc

请问free(str);一句作了些什么事情?它是释放str所指向的内存空间,str本身的值不变,是么?那str所指向的空间释放后,这个空间具体又有什么变化?
也就是想搞清楚,在free()前后,str的值和str所指向的空间的值有什么变化?释放空间具体作了那些工作?
请帮忙!
...全文
584 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
donkey20041121 2007-11-07
  • 打赏
  • 举报
回复
无语了。林锐的书里讲的那么清楚。
llixy 2007-11-07
  • 打赏
  • 举报
回复
CSYNYK :呵呵,就是为了避免无用嘛!free()以后一旦误用,将其指向NULL,编译器就会提示你,避免产生错误!如果没有指向NULL,你的程序可以照常编译,照常运行-------但不知道什么时候就莫名其妙的出错或者死掉了!


很实用的方法!
candyrong 2007-11-07
  • 打赏
  • 举报
回复
传说中的野指针
alexander068 2007-11-07
  • 打赏
  • 举报
回复
明白了,非常感谢大家!
mig1975 2007-11-07
  • 打赏
  • 举报
回复
学习了。真得很实用,原来写c的时候,总是在寻找这样的问题。
xzcanle 2007-11-06
  • 打赏
  • 举报
回复
注意指针 与指针指向的东西的区别
多看看书
guzhilei1986 2007-11-06
  • 打赏
  • 举报
回复
#include   <iostream>
using namespace std;
int main()
{
int a[]={10,20,30,40};
cout<<a[6]<<endl;//不会报错,并输出一个值。
//在c/c++中对着样的越界访问是没有限制的,
//所以str被free以后只是告诉系统这个内存空间可以分配给别的程序用,str的内容没有变化。所以照样可以访问。
}
stoneyrh 2007-11-06
  • 打赏
  • 举报
回复
free掉的内存会被放入到系统内存堆中,具体的摆放方式由系统的内存堆管理算法实现
free只影响到内存块本身的使用情况,并不影响到内存块中原来的内容,因此free后再printf原来的内容,仍然不变,但是要注意,如果在free和printf之间,该块内存再次被分配出去(如多线程)且内容被修改了,那么内容就会被改变,这样的访问方式并不提倡,虽然并不一定导致访问违例
ttlyfast 2007-11-06
  • 打赏
  • 举报
回复
又是高质量...那本模板样的书

俺滴牙都要掉下来拉 ~~
zhangyanli 2007-11-06
  • 打赏
  • 举报
回复
to:楼主,石头解释的第二条你看了吗?

----------

2、在str指向的空间释放给系统之后,原来空间的内容并没有被立即清除掉。但一旦系统将这块空间重新分配给别的变量之后,一旦有变量赋值操作,该空间内的值就会变成新的变量的值。(这也是为什么要进行str=NULL操作,就是为了避免原来的指针str操作新的变量)。
zxq80 2007-11-06
  • 打赏
  • 举报
回复
#include <stdio.h>
main()
{
char *str=NULL;
str=(char*)malloc(100);
strcpy(str, "abc ");
printf( "%s\n ",str);
free(str);
str = NULL; //设置为空,否则会出现野指针;
printf( "%s\n ",str);
getch();
}
yoyoye 2007-11-06
  • 打赏
  • 举报
回复
看上去我也不用提问了。哈哈
coderorprogrammer 2007-11-06
  • 打赏
  • 举报
回复
讲的很清楚啊!赞!
key_hua 2007-11-06
  • 打赏
  • 举报
回复
来学习的
yi1234yi 2007-11-06
  • 打赏
  • 举报
回复
CSYNYK 是高人啊


同意
cuijiajia 2007-11-06
  • 打赏
  • 举报
回复
CSYNYK 是高人啊
mx81831 2007-11-05
  • 打赏
  • 举报
回复
看来好多人都明白啊!
huhaihong 2007-11-05
  • 打赏
  • 举报
回复
free(str)是已经释放了str所指向的空间,但str还在吧
但str所指向的空间里面的东西可能还在,也可能是其它东西了
所以使用free(str)后,最好再加str=NULL;这句,避免内存泄露
donnychou 2007-11-05
  • 打赏
  • 举报
回复
学习了。
chlaws 2007-11-05
  • 打赏
  • 举报
回复
呵呵。学习了
顶下。
加载更多回复(13)

69,373

社区成员

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

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