free真的释放内存了吗?

dxy0981 2009-01-08 09:32:47

#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p;
p=(int *)malloc(sizeof(int));
*p=2;
printf("%d,%p\n",*p,p);
free(p);
printf("%d,%p\n",*p,p);
*p=1;
printf("%d,%p\n",*p,p);
return 0;
}
结果为:

在MinGW Developer Studio中:
2,003E3BE8
0,003E3BE8
1,003E3BE8

在VC6.0中:
2,00380FE0
-572662307,00380FE0
1,00380FE0

问题是:为什么用free函数释放了内存后,仍能对*p赋值?并且运行时也没发生错误?
...全文
1610 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxy0981 2009-04-08
  • 打赏
  • 举报
回复
大家说得都很好,但分数实在不多,只好这样给了。
再一次谢谢大家的解答。
dxy0981 2009-03-04
  • 打赏
  • 举报
回复
谢谢各位的解答!
leboc 2009-01-26
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 ningzhiyu 的回复:]
引用 34 楼 badcrow 的回复:
引用 4 楼 lann64 的回复:
你把房子卖了,你就算还拿着钥匙,能进门,这也不是你的房子了。


说的太经典了,
补充一句, 你照样可以把你的钱放在在这个房子里,但是不保证过一会还在。

这个经典,牛,顶一个
[/Quote]

哈哈,都是牛人.
leboc 2009-01-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lann64 的回复:]
你把房子卖了,你就算还拿着钥匙,能进门,这也不是你的房子了。
[/Quote]
哈,~比喻得真不错.
ningzhiyu 2009-01-24
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 badcrow 的回复:]
引用 4 楼 lann64 的回复:
你把房子卖了,你就算还拿着钥匙,能进门,这也不是你的房子了。


说的太经典了,
补充一句, 你照样可以把你的钱放在在这个房子里,但是不保证过一会还在。
[/Quote]
这个经典,牛,顶一个
na2650945 2009-01-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaoyisnail 的回复:]
你是可以继续接引用,但是那时的值已经是未知的了,就这么简单,所以对也指针解引用是件很危险的事情
[/Quote]
学习了。
biweilun 2009-01-23
  • 打赏
  • 举报
回复
释放的是p这个指针所指向的内存地址或是连续的一串地址,而不是销毁p这个变量
dongpy 2009-01-23
  • 打赏
  • 举报
回复
对*p写操作再补充一下:
即便没有破坏管理器的内部数据.当这块内存被malloc操作再次分配给用户进程后,对*p的写操作,也很有可能因为破坏进程其他数据(malloc后得到与*p相同的地址),而出错.
only_lonely 2009-01-23
  • 打赏
  • 举报
回复
UP!
dongpy 2009-01-23
  • 打赏
  • 举报
回复
堆内存的交互过程:用户程序->C库堆管理器->内核.

用户调用malloc和free,只是改变堆管理器内部数据结构,对于内核来说,是透明的.
堆管理器通过系统调用brk/sbrk来扩展或收缩堆空间,扩展时将虚拟地址空间映射到物理地址空间,收缩时则断开映射,扩展和收缩只能在堆的顶部操作,保持堆空间的连续性.

因此free(p)后,p指向的虚拟空间一般不会马上断开映射,因此对*p读操作肯定不会出错,直到堆收缩并断开该虚拟空间的映射.

而对*p写操作,则会比读操作更容易出错,因为堆管理器的数据结构与*p在同一空间,对*p写操作,可能会破坏管理器的数据结构(当管理器的内部数据与*p的地址相同时),使堆管理器崩溃而导致用户进程退出.
悠悠长风 2009-01-12
  • 打赏
  • 举报
回复
你这是碰巧了。
即使你不申请内存,往一个非法的地址写,也不见得出错啊。

shilei_815 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lann64 的回复:]
引用 2 楼 waizqfor 的回复:
再赋值这时候的*P是常量存储在常量区 赋值是没有问题的 不过不能更改P的值 会出现错误

在说啥呢?
[/Quote]

我也不懂。。。。。什么叫赋值是没有问题的,不过不能更改P的值!
shilei_815 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lann64 的回复:]
你把房子卖了,你就算还拿着钥匙,能进门,这也不是你的房子了。
[/Quote]

列子很贴切!
traceless 2009-01-12
  • 打赏
  • 举报
回复
我晕,看到某个楼层很搞笑呀 o(∩_∩)o...哈哈
gql1123 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 SmallBigCat 的回复:]
p,你的房子所在地址,根据p这个地址,你可以找到你的房子,在有效范围内生活(如做饭、大便等),但记得别越界到邻居家了;如memcpy(p, xxx, xx);需要指定长度

free(p);你把房子卖了,但p这个地址还存在你的记忆中,除非你把你房子的地址从你记忆中抹去,即p = NULL;

如果你没有抹去对你房子的记忆,即p != NULL; 你仍然可以找到那所房子,但是那房子已经不属于你了;

如果你还要进房子生活(如做饭、大便等),即对…
[/Quote]
如果你大便的时候,被房主逮着了。你就挂了。就像程序里异常了。如果你运气好逮不着,就没啥问题。哈哈。
tocpve 2009-01-12
  • 打赏
  • 举报
回复
学习
foxscripting 2009-01-10
  • 打赏
  • 举报
回复
今天刚好看到malloc和free的实现,贴个网站给你看看,就晓得了

http://www.gd-emb.org/detail/id-36209.html
liliflashfly 2009-01-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lann64 的回复:]
你把房子卖了,你就算还拿着钥匙,能进门,这也不是你的房子了。
[/Quote]

很形象,随便进去的话就有可能出事咯...
「已注销」 2009-01-09
  • 打赏
  • 举报
回复
由操作系统的设计决定的,
SmallBigCat 2009-01-09
  • 打赏
  • 举报
回复
p,你的房子所在地址,根据p这个地址,你可以找到你的房子,在有效范围内生活(如做饭、大便等),但记得别越界到邻居家了;如memcpy(p, xxx, xx);需要指定长度

free(p);你把房子卖了,但p这个地址还存在你的记忆中,除非你把你房子的地址从你记忆中抹去,即p = NULL;

如果你没有抹去对你房子的记忆,即p != NULL; 你仍然可以找到那所房子,但是那房子已经不属于你了;

如果你还要进房子生活(如做饭、大便等),即对p进行写入操作,那么你已经违法了
加载更多回复(43)

69,371

社区成员

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

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