2014-06-23 36 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通常使用內存池,「元數據」爲在分配的內存塊之間「不在」之間。