关于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大小的内存(虽然他并不是碎片)?