這兩個代碼行的內存使用情況是否有區別?int x [10]分配多少內存?
int *a = malloc(10 * sizeof(int));
int b[10];
第一行應爲10個整數和1個指針分配內存。但我不確定第二個。這是否也會爲10個整數和1個指針分配內存,或者只分配10個內存?
這兩個代碼行的內存使用情況是否有區別?int x [10]分配多少內存?
int *a = malloc(10 * sizeof(int));
int b[10];
第一行應爲10個整數和1個指針分配內存。但我不確定第二個。這是否也會爲10個整數和1個指針分配內存,或者只分配10個內存?
簡而言之:
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?"。
在第一種情況下,a
本身佔用sizeof(int *)
字節的自動存儲空間,並且指向10 * sizeof(int)
字節的動態存儲。
在後一種情況下,b
佔用10 * sizeof(int)
字節的自動存儲。因爲b
是一個數組,所以沒有指針。
因此,第一種情況使用更多的總字節數,但在堆棧上較少(假設堆棧正在用於自動存儲)。
如果正在使用的字節總數相對較小,則自動存儲通常很好。對於更大的數量,動態存儲是首選。特別是對於堆棧實現,如果太多的自動變量可能會溢出堆棧。
根據編譯器的工作原理,它可能會或可能不會在堆棧中爲指針「* a」分配任何內存。如果你在任何地方使用'&a',是的,但是否則所有投注都關閉。 –
謝謝。我會讚揚我的回答。 – giusti
@DietrichEpp再讀一遍,我可能誤解了你的評論。你能給我一個具體的例子嗎? – giusti