2011-12-20 340 views
6

我碰到下面的代碼:malloc會保證內存對齊嗎?

int main() 
{ 
    char *A=(char *)malloc(20); 
    char *B=(char *)malloc(10); 
    char *C=(char *)malloc(10); 
    printf("\n%d",A); 
    printf("\t%d",B); 
    printf("\t%d\n",C); 
    return 0; 
} 
//output-- 152928264  152928288 152928304 

我想知道如何分配和填充由malloc()完成。看看輸出,我可以看到起始地址是8的倍數。是否有其他規則?

+2

無論您通過研究計算機上的malloc做什麼「規則」......只要您移動到另一臺計算機,或更改編譯器選項,或者月亮的相位發生變化,就應該沒有學習。 ..,... :) – pmg 2011-12-20 13:03:28

+3

要打印一個指針,你應該使用'「%p」'並將其轉換爲void *':'printf(「%p」,(void *)A);' – pmg 2011-12-20 13:04:22

+0

i dont真正理解你的問題。 – 2011-12-20 13:05:01

回答

8

Accdording到this documentation page

通過的malloc或realloc在GNU系統返回的塊的地址總是八(或16在64位系統)的倍數。

一般而言,malloc的實現是系統特定的。他們都爲自己的簿記保留一些內存(例如分配塊的實際長度),以便在您撥打free時能夠正確釋放該內存。如果您需要對齊到特定邊界,請使用其他功能,例如posix_memalign

4

唯一的標準規則是由malloc返回的地址將被適當對齊以存儲任何類型的變量。究竟是什麼意思是平臺特定的(因爲對齊需求因平臺而異)。

0

對於32位Linux系統:
當malloc()分配內存時,它將以8的倍數(8的填充)分配內存併爲簿記分配額外的8個字節。

例如:

的malloc(10)和的malloc(12)將(填充+ 8 字節記賬後16個字節)分配24個字節的存儲器。

malloc()做填充因爲返回的地址將是8的倍數,因此對於任何類型的指針都是有效的。當我們調用免費功能時,使用8個字節的簿記。簿記字節存儲分配的內存的長度。