2014-10-27 36 views

回答

3

是的,當你malloc你在堆中分配。

malloc函數從堆中請求一塊內存。如果請求被授予,操作系統將保留請求的請求的內存量。

如果數據的生命週期必須與分配的代碼範圍不同,那麼您應該使用malloc。例如:你在一個函數中使用malloc,你存儲/保存一個指向該分配空間的指針,然後你可以在另一個函數中使用它。

與堆棧分配相比,另一個優勢是您可以檢查malloc是否失敗,假設您沒有足夠的可用內存。

附註:不要忘了freemalloc

+2

「是的,當你在malloc中分配堆時。」 - 至少在使用堆實現動態內存分配系統時。它可能不是(例如在AVR微控制器上,它不是)。使用正確的措辭(「動態分配」)不會更困難時,使用不精確的,與實施細節相關的術語毫無意義。 – 2014-10-27 05:35:44

0

分配請求的字節大小,並返回分配的空間的指針的第一個字節

ptr=(cast-type*)malloc(byte-size) 

這裏,PTR是鑄型的指針。 malloc()函數返回一個指向字節大小的內存區域的指針。如果空間不足,分配失敗並返回NULL指針。

ptr=(int*)malloc(100*sizeof(int)); 

時,要動態分配的內存(在運行時)時使用。通常每個程序在運行時都與堆內存相關聯。因此,當使用free()完成內存使用時,應該將其返回。

+0

http://meta.stackoverflow.com/questions/273024/position-fixed-navigation-bar – Mat 2014-10-27 04:48:49

+2

[鑄造標準分配器的返回值是有害的。](http://stackoverflow.com/questions/605845/do- i-cast-of-malloc) – 2014-10-27 05:34:02

2

另一個區別(在其他答案中還沒有提到)是由malloc()創建的數組是匿名的 - 您有一個指向數據的指針,但沒有數據的名稱。

2

堆棧和堆中的數組在使用方面沒有區別。兩者都是記憶 - 它們在分配方面不同。 malloc內部調用brk()sbrk()來改變「程序中斷」,即程序地址空間根據您的malloced大小要求。

當您不完全知道要分配多少內存時使用malloc。或者如果您需要重新使用內存,因爲一次只使用一個或兩個時,不能分配1000個大小爲10的數組。然後去malloc,因爲你完成後可以釋放內存。

注意:永遠不要嘗試free()靜態分配的變量!

+2

歡迎來到StackOverflow。但根據[Rhythm'n'Grammar](http://www.hrwiki.org/wiki/local_news#Easter_Eggs):*「我們不在乎他們如何在互聯網上拼寫東西,當你回答SO時,你[拼出整個單詞](http://stackoverflow.com/revisions/26581453/1)。我們不關心你的手機裏有一個攝像頭。「*。飯桶。 :-) – HostileFork 2014-10-27 06:43:51

+2

當然,下次還會繼續。 :) – 2014-10-27 07:22:26

0

你的問題是「通過malloc生成的數組與通過malloc生成的數組不同嗎?」

答案:就C語言而言,沒有區別。 C獲取數組地址並進行相對於它的索引,因此數組是否在堆中分配或靜態聲明並不重要。

int a[10]; 
int *aa; 
int *b; 

b= a; 
b[3]= 4; 

aa= calloc(10, sizeof(int)); 
b= aa; 
b[3]= 4;  

注意:malloc返回非零內存; calloc返回歸零內存並確保返回的塊適當對齊。

相關問題