请教一道小题目

昵称很不好取 2009-09-22 01:39:11
void Test(void){
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL){
strcpy(str,"world");
printf("%s\n",str);
}
}
结果是world,我的疑问是free掉str以后,虽然str依然保存malloc分配的地址,但已经不能通过它使用了,为什么下面还可以调用strcpy向这个地址赋值呢?
...全文
285 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
superliubao 2009-09-22
  • 打赏
  • 举报
回复
真是学习了!!!
daixuefeng203 2009-09-22
  • 打赏
  • 举报
回复
野指针别乱用啊
richarddahn 2009-09-22
  • 打赏
  • 举报
回复
free掉后不一定就是NULL了,最好要主动置NULL
pigniyan 2009-09-22
  • 打赏
  • 举报
回复
void Test(void){
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL){
strcpy(str,"world");
printf("%s\n",str);
}
}
结果是world,我的疑问是free掉str以后,虽然str依然保存malloc分配的地址,但已经不能通过它使用了,为什么下面还可以调用strcpy向这个地址赋值呢?
//str指针虽然已被系统收回分配的内存空间,但是这个指针现在还是指向当初分配空间的那段首地址,即使这段内存已被其它程序占用,但是调用strcpy(str,"world")后会覆盖掉上面已存的变量,如果后面的内存空间有数值的话,会一直输出,直到碰到'\0'才结束.这也就是所谓的野指针,当free(str)后应把str=NULL,这样才是正确的.
bluepei28 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chungsijay 的回复:]
因為 free 掉 str 後,意思是指這 100 大小的空間沒有人使用了,
可以給其他人使用,也就是之後如果你再呼叫 malloc 的話就會用到這個空間,
即使目前 str 還是指向這塊空間的頭;
請看以下例子你就會明白:

<code>
int main(void){
    char *str = (char *) malloc(100);
    strcpy(str, "hello");
    free(str);
    char *str2 = (char *) malloc(5);
    strcpy(str2, "new");
    printf("%s\n",str);
    return 0;
}
</code>
[/Quote]
=====================================
我在DEV上面实验发现,后面要malloc相同大小的空间才会去用以前malloc了的空间,否者是另外开辟地方
晨星 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fiveyes 的回复:]
已经解释得比较清楚了。

楼主可以联想一下硬盘数据恢复。整个硬盘都格式化了,什么文件都没了,为什么还能恢复那么多数据呢?就是同样的道理。删除文件之后,如果马上就用数据全部覆盖,会浪费许多的时间,所以不这么做,只是给那块地方做上标记,证明这是一块无主之地,谁想用都可以用。

内存也是这样的。
[/Quote]
对,这个比方很好。
你已经通过free告诉底层库你不再需要那段内存了,既然你都不需要了,它为什么要花时间帮你清扫呢?相反,如果你说你仍然需要它,而且还想让库帮你清理一下(比如通过memset),那样它才会帮你清扫。
hblhshb 2009-09-22
  • 打赏
  • 举报
回复
楼上的都讲清楚了
wenhuahetao 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 thefirstz 的回复:]
C/C++ codevoid Test(void){char*str= (char*) malloc(100);
strcpy(str,"hello");
free(str);if(str!= NULL){
strcpy(str,"world");
printf("%s\n",str);
}
}
结果是world,我的疑问是free掉str以¡­
[/Quote]
我对此的理解如下:
1、free(str) //释放str所指向的空间----告诉系统,这个空间可以被重新分配了。此时str本身的值(即所指向的空间不变),所以为了保证指针的安全性,通常都会在free(str);之后紧跟一句str=NULL,避免str再次操作到原来的空间。因为你没有str=NULL,在str指向的空间释放给系统之后,原来空间的内容并没有被立即清除掉。但一旦系统将这块空间重新分配给别的变量之后,一旦有变量赋值操作,该空间内的值就会变成新的变量的值。2、其实进行str=NULL操作,为了避免原来的指针str操作新的变量。
timpa 2009-09-22
  • 打赏
  • 举报
回复
我们一般都使用另外一个Free

#define Free(x) if (NULL != (x)) \
{\
free(x);\
(x) = NULL;\
}
JaneThink 2009-09-22
  • 打赏
  • 举报
回复
楼上的比喻很形象,现实中的世界也是这样。总结起来可能就是个权限问题,打个比方。在一个全公有化的社会,所有的东西都是属于社会的。你使用东西都要向社会提出申请,社会再指点物品分给你。我现在申请了一个桌子,用完了我再换给社会,这时候你急着用东西,看到了桌子就把东西放到上面。你很高兴,没用申请用了也没问题。但你的行为是非法的。如果社会把这个桌子分配给了别人,那么你的东西可能被扔掉了。对你来说就会产生其他的连锁反应了。 上面的内容与之对应应该是很容易理解的。 所到底,电脑的使用本质也是资源的使用。
fiveyes 2009-09-22
  • 打赏
  • 举报
回复
已经解释得比较清楚了。

楼主可以联想一下硬盘数据恢复。整个硬盘都格式化了,什么文件都没了,为什么还能恢复那么多数据呢?就是同样的道理。删除文件之后,如果马上就用数据全部覆盖,会浪费许多的时间,所以不这么做,只是给那块地方做上标记,证明这是一块无主之地,谁想用都可以用。

内存也是这样的。
only_delusion 2009-09-22
  • 打赏
  • 举报
回复
据说free掉之后 指针指向不定 有可能空 有可能指向其他内存空间 当你使用的时候 也许会改掉其他的有用的信息..... 所以都不建议这么用
Johnny_Lx 2009-09-22
  • 打赏
  • 举报
回复
malloc和new作用相同,都是在堆上申请一块内存,在用完后我们要对应的使用free或者delete来回收,但是回收完并不是说事情都完成,要习惯的将申请的内存置NULL,否则那块内存上的数据在该内存被其他地方申请前还是存在的。
forster 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chungsijay 的回复:]
因為 free 掉 str 後,意思是指這 100 大小的空間沒有人使用了,
可以給其他人使用,也就是之後如果你再呼叫 malloc 的話就會用到這個空間,
即使目前 str 還是指向這塊空間的頭;
請看以下例子你就會明白:

<code>
int main(void){
    char *str = (char *) malloc(100);
    strcpy(str, "hello");
    free(str);
    char *str2 = (char *) malloc(5);
    strcpy(str2, "new");
    printf("%s\n",str);
    return 0;
}
</code>
[/Quote]
看帖要回贴
chungsijay 2009-09-22
  • 打赏
  • 举报
回复
因為 free 掉 str 後,意思是指這 100 大小的空間沒有人使用了,
可以給其他人使用,也就是之後如果你再呼叫 malloc 的話就會用到這個空間,
即使目前 str 還是指向這塊空間的頭;
請看以下例子你就會明白:

<code>
int main(void){
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
char *str2 = (char *) malloc(5);
strcpy(str2, "new");
printf("%s\n",str);
return 0;
}
</code>
kouwenlong 2009-09-22
  • 打赏
  • 举报
回复
你free的只是它分配的内存,使这块内存变得无效。但是这个指针变量还是存在的,你还可以从新为它重新赋值,指向不同的地址。
fox000002 2009-09-22
  • 打赏
  • 举报
回复
一般这么写

free(str);
str = NULL;
ZH_Fly4evEr 2009-09-22
  • 打赏
  • 举报
回复
free后的内存如果还没分配给其他用,它的内容是不会改变的,free只是告诉系统这块内存可以分配给其他用。但你可以打印出它的内容,为了防止这一点,free后要str=NULL
wanjingwei 2009-09-22
  • 打赏
  • 举报
回复
指针p被调用了free后它的地址值并没有改变,只是该地址对应的内存中原来有意义的值变成了垃圾,“p”却还是指向的这块内存。一般都free完后将p的值设为NULL,否则会让别人以为p是一个有意义的指针而误使用它
昵称很不好取 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
没说不能使用啊。只是比较危险。
就好比危房也有不倒的时候。
[/Quote]
这么说那free掉以后,保存在堆上的内存也不清空吗?还是等到程序结束时才清空?
加载更多回复(1)

70,020

社区成员

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

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