2014-06-23 34 views
1

令人惊讶的两个方案给了两个指针相同,即使数据类型不同的区别.....的malloc存储元数据

究竟是怎样的malloc存储其元数据是什么,我试图找到出与这个小实验......

计划1:

int main() 
{ 
    char *i,*j; 

    i=(char*)malloc (sizeof(char)); 
    j=(char*)malloc (sizeof(char)); 

    printf ("%x\n",i); 

    printf ("%x\n",j); 
return 0; 
} 

输出:

710010 
710030 

方案二:

int main() 
{ 
    int *i,*j; 

    i=(int*)malloc (sizeof(int)); 
    j=(int*)malloc (sizeof(int)); 

    printf ("%x\n",i); 

    printf ("%x\n",j); 
return 0; 
} 

输出:

16b8010 
16b8030 

我有什么考虑到这一程序之前:

| meta data of i | memory space of i | meta data of j | memory space of j | 

但结果并不支持这个理论....

+1

FYI:不要投'malloc'结果](http://stackoverflow.com/q/605845/119527)。 –

+1

^无关评论 – PRP

+0

函数malloc()与双向链接列表以及其他一些开销一起使用。因此,连续的malloc调用不会以相互之间的预期偏移返回地址。此外,char在函数调用中被提升为int。此外,malloc()的大多数实现都以最小大小的倍数来处理内存,以减少必要的数学计算量。而且,许多malloc()实现都可以使用预先分配的内存池。结果几乎所有的malloc()调用实际上都会获得比预期更多的内存。 – user3629249

回答

4

malloc“四舍五入”分配给在编​​译时设置的一个方便的大小 图书馆。这会导致后续分配和释放分割内存的次数少于创建分配以完全匹配请求的次数。

malloc存储其元数据实际上不是为什么这两个值都为0x20“分开”。但是你可以阅读一个实现malloc(和朋友)here的方法;特别参见滑动16和28

设想一个字符串操作的程序,其中,许多不同尺寸的分配在“随机”顺序发生的情况下。微小的“剩余”块将很快发展,在所使用的块之间留下完全无用的内存字节。 malloc通过满足所有内存请求的一些最小尺寸的倍数(在这种情况下显然是0x20)来防止这种情况。 (OK,在技术上是你要求0X1E字节,将有2个字节的“浪费”了你的请求后,剩余空间过和未使用。由于malloc分配0x20的字节而不是0X1E,但不会永远是一个2字节的片段遗留。这是非常好的,因为malloc的元字符串肯定大于2字节,所以没有办法跟踪这些字节。)

+0

可以请你详细阐述你的答案..我想知道malloc在哪里存储它的元数据和所有的细节? – PRP

0

malloc通常使用内存池,“元数据”为在分配的内存块之间“不在”之间。