关于malloc和free的疑惑...

Lenus 2006-11-02 03:51:39
以前都是自以为的理解malloc,或者看了些书觉得自己理解是对的,直到今天实验了一下才知道,真相永远没有大白....

起因:我前几天做到一题

char *p=(char *)malloc(20);

free(p);

if(p)
{
strcpy(p,"Hello World\n");
printf(p);
}
else
{
printf("p is point to NULL\n");
}

请问输出什么?

我很明白他出题的意思,我也明白free了以后这个p不会指向NULL。但是,我觉得你已经free了以后怎么能使用strcpy呢?!

我不相信答案,于是我想证明一下,我在vc6.0中做了实验。
但是当我键入上面的代码时的确,可以strcpy!并且输出了Hello World。我想可能是这个堆并没有向系统额外的开辟空间而造成的吧。于是我尝试的做了一下的实验。

展开:
于是我试着使用malloc申请大的空间,问题来了:
char *p=(char *)malloc(0x10000);

free(p);

当上面的代码运行过以后,本来应该free掉申请出来的空间,但是事实上仍然残留了一些0x1000大小的内存,没有被完全释放,当然这部分内存当我再次申请的时候可以重复使用并没有形成碎片。
也就是说如果上面的那道题目修改成

char *p=(char *)malloc(0x10000); //增加申请空间

free(p);

if(p)
{
strcpy(p,"Hello World\n");
printf(p);
}
else
{
printf("p is point to NULL\n");
}

答案仍然输出 Hello World

而直到我增加到了0x7EFBB(520125)的时候,情况又发生了变化。malloc申请到的地址一个不留的全部被free掉了。
也就是说当上面的程序修改为malloc(520125);的时候,这个题目就出现了非法操作~~~

问题:
不知道大家有没有想过这个问题呢?
1.malloc和free是如何工作的?
2.为什么对于520125这个值敏感(520124就还是没有完全的释放而到520125就会完全释放掉)?
3.为什么free了还要剩余0x1000大小的内存(虽然他并不是碎片)?
...全文
868 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lenus 2006-11-04
  • 打赏
  • 举报
回复
多谢 楼上的。
xyq1986 2006-11-03
  • 打赏
  • 举报
回复
After a memory block has been freed, _heapmin minimizes the amount of free memory on the heap by coalescing the unused regions and releasing them back to the operating system. Freed memory that is not released to the operating system is restored to the free pool and is available for allocation again.

carbonic 2006-11-03
  • 打赏
  • 举报
回复
mark,下班了。
飞哥 2006-11-02
  • 打赏
  • 举报
回复
浅谈C中的malloc和free

见帖:
http://www.bc-cn.net/Article/kfyy/cyy/jszl/200608/4238.html

这个似乎是键键写的,曾经看过~
wzd268 2006-11-02
  • 打赏
  • 举报
回复
free后要p=NULL
sunkaina 2006-11-02
  • 打赏
  • 举报
回复
free的是内存空间,这个指针变量p还是在的,还是有值的,如果free(p);后再使p=NULL;
strcpy(p,"Hello World\n");printf(p);就没东东了
hacker_red 2006-11-02
  • 打赏
  • 举报
回复
malloc分配一块空间,在前面会一个记号标记说“好,这块空间有人用了,别人不能用了”
free释放一块空间,就是改变了那个标记说“好,这块空间我不要了,你要用就用吧”
xqxxl 2006-11-02
  • 打赏
  • 举报
回复
你好好看看内存管理和分页机制,涉及多页分配和空间回收
morphymorphy 2006-11-02
  • 打赏
  • 举报
回复
浅谈C中的malloc和free

见帖:
http://www.bc-cn.net/Article/kfyy/cyy/jszl/200608/4238.html
morphymorphy 2006-11-02
  • 打赏
  • 举报
回复
野指针问题。。

69,377

社区成员

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

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