内存分配释放

Razer 2013-09-08 01:37:20
void Test(void){
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL){
strcpy(str, “world”);
printf(str);
}
}
答:测试后能输出“world”

请问下内存应该被释放掉了,怎么还能输出world。
...全文
394 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
军说网事 2013-09-19
  • 打赏
  • 举报
回复
引用 楼主 bad10000 的回复:
void Test(void){ char *str = (char *) malloc(100); strcpy(str, “hello”); free(str); if(str != NULL){ strcpy(str, “world”); printf(str); } } 答:测试后能输出“world” 请问下内存应该被释放掉了,怎么还能输出world。
free(str)后,应该str=null,否则,str是野指针。 free只是告诉这块内存可以再使用了,而内存里的内容还是存在,并且str的还指向这块内存, 所以应该加上str=null。
cfvmario 2013-09-18
  • 打赏
  • 举报
回复
没出运行时错误该烧香。来个access violation啥的都有可能
水平不流 2013-09-18
  • 打赏
  • 举报
回复
学习了。平时没太注意这个细节。
赵4老师 2013-09-18
  • 打赏
  • 举报
回复
“malloc”和“free” 相当于 “借”和“还” 不相当于 “创造”和“毁灭”!
guoqi6716510 2013-09-18
  • 打赏
  • 举报
回复
指针变成了野指针,但是释放掉了里面的内容还在,个人感觉 NULL != str,不安全
自信男孩 2013-09-18
  • 打赏
  • 举报
回复
释放了不意味着该部分的空间里的内容已经清除了。只是,代表该区域的空间可以再次被申请了。
adfaksdf 2013-09-17
  • 打赏
  • 举报
回复
free(str)后应将str置NULL。你那样做,其实是向原内存出重新写入了,当然能够打印出了。
  • 打赏
  • 举报
回复
free(str)之后,str成为野指针,程序员应该避免这种情况
zhao 2013-09-11
  • 打赏
  • 举报
回复
free之后表示别人可用了,你这里仍能输出原来结果其实是不一定的,因为free后别人是可以改写这段内存的所以最好free之后赋值为NULL
赵4老师 2013-09-10
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
lm_whales 2013-09-10
  • 打赏
  • 举报
回复
free 又不是内存热拔插,只是管理权由你的代码,转交给库里的内存管理模块而已,内存当然可以访问 只是,这种访问,是不应该出现在代码中的. 因为这块内存已经交还库里的内存管理模块, 你的代码已经不是他的主人了. 出不出错,看有没有人追究而已. 从逻辑上说,错误已经出了,没有表现出来而已. 偶尔去别人地里偷菜,到没什么,被人家抓住了,就不好了; 可能就给打死了,冤不冤呀你说.
独孤的根号3 2013-09-09
  • 打赏
  • 举报
回复
free(value); value = NULL; 释放完毕清空,不然后面有引用这块内存的话你丫可能就悲剧了
TheMadMan 2013-09-09
  • 打赏
  • 举报
回复
基本就是这个思路:1,声请内存。2,用完释放。3,指针清空。楼上的说的都对。一定要释放,不然浪费。
兆帅 2013-09-09
  • 打赏
  • 举报
回复

free(str);
str=NULL;
赵4老师 2013-09-09
  • 打赏
  • 举报
回复
参考Linux下free函数的源代码。
modyaj 2013-09-08
  • 打赏
  • 举报
回复
free(str);后记得 str = NULL, 不然以后所空判断的时候就伤心了 而且不容易发现这样的错误, 你只是释放了内存上的数据 但是内存还是在的 而且里面的东西是未知的
海的神话 2013-09-08
  • 打赏
  • 举报
回复
是释放了, 但是指针还是指向那个地址。所以还是可以用原来的指针的,只不过有可能会出现冲突而已
AnYidan 2013-09-08
  • 打赏
  • 举报
回复
lz 居然有空去测试?
max_min_ 2013-09-08
  • 打赏
  • 举报
回复
分配的内存还没有擦除掉,所以还可以访问到有效数据的, 但是不建议这么在做!
qzf362269994 2013-09-08
  • 打赏
  • 举报
回复
进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。 当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些 ),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用 内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你 是可以继续访问这块地址的, 释放后,最好把str=NULL

69,371

社区成员

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

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