2017-01-04 69 views
18

這兩個代碼行的內存使用情況是否有區別?int x [10]分配多少內存?

int *a = malloc(10 * sizeof(int)); 
int b[10]; 

第一行應爲10個整數和1個指針分配內存。但我不確定第二個。這是否也會爲10個整數和1個指針分配內存,或者只分配10個內存?

回答

21

簡而言之:

int *a = malloc(10 * sizeof(int)); 

分配至少sizeof(int*)自動存儲的字節的指針*a。當調用malloc時,這將爲您的程序分配至少sizeof(int) * 10字節的動態存儲空間。

在另一方面:

int b[10]; 

分配至少sizeof(int) * 10自動存儲的字節。這裏沒有指針。在表達式中使用名稱b時(例如:a = b),它會衰減爲指針。但是a是一個指針,b是一個數組。在C FAQ上檢查:C-FAQ Sec. 6: arrays and pointers

在最常見的情況下,「自動存儲」是指「堆棧」,「動態存儲」是指「堆」。但事實並非如此。您可能需要在此問題上閱讀關於此術語的一些討論:"Why are the terms 「automatic」 and 「dynamic」 preferred over the terms 「stack」 and 「heap」 in C++ memory management?"

+7

根據編譯器的工作原理,它可能會或可能不會在堆棧中爲指針「* a」分配任何內存。如果你在任何地方使用'&a',是的,但是否則所有投注都關閉。 –

+0

謝謝。我會讚揚我的回答。 – giusti

+1

@DietrichEpp再讀一遍,我可能誤解了你的評論。你能給我一個具體的例子嗎? – giusti

8

在第一種情況下,a本身佔用sizeof(int *)字節的自動存儲空間,並且指向10 * sizeof(int)字節的動態存儲。

在後一種情況下,b佔用10 * sizeof(int)字節的自動存儲。因爲b是一個數組,所以沒有指針。

因此,第一種情況使用更多的總字節數,但在堆棧上較少(假設堆棧正在用於自動存儲)。

如果正在使用的字節總數相對較小,則自動存儲通常很好。對於更大的數量,動態存儲是首選。特別是對於堆棧實現,如果太多的自動變量可能會溢出堆棧。