2012-12-16 43 views

回答

3

您不控制堆棧分配內存的生命期範圍,它只在範圍內有效(除非使其爲靜態)。

malloc用於在堆上分配內存。只有在該存儲器上撥打free纔有效。

在堆棧上分配內存會更快,通常是因爲您實際上沒有分配新內存,而只是保留了更多已使用的內容,但不控制生命週期,它由您的區塊或功能的範圍。

+0

非常感謝你的快速回答!你能給我一個malloc更好的例子嗎?如果它不要求太多,因爲我想知道在哪些情況下聲明會失敗 – user1907948

+0

當沒有剩餘堆棧空間時,堆棧分配失敗,無限遞歸導致同樣的問題,堆棧溢出。堆分配使您可以訪問堆,它可能比您保留的堆棧空間大很多,但不是無限的或沒有問題。當你打算分享更長時間的東西時,請使用堆,但要注意諸如堆碎片之類的事情。 –

2

char *a = malloc(size);和char * a [size];`有什麼區別?

第一個聲明指向char的指針並在堆上爲它分配size個字節。第二個分配size件指針char。它們不相同。

一個比另一個更好嗎?

不,它們有不同的用途。

使用malloc()有什麼優勢嗎?

是的。如果你想從一個函數返回一個數組,你可以這樣做:

char a[size]; 
return a; 

因爲那時a超出後返回範圍,並使用它會導致不確定的行爲。因此,在這種情況下,你必須使用

char *a = malloc(size); 
return a; 

(通常是這樣的話,因爲你大概會希望每次都從一個函數返回一個新字符串 - 但是,如果這不是一個要求,你可以使用靜態數組,在本地聲明)。

但是,如果數組僅用於本地,則通常建議使用自動(堆棧)數組而不使用malloc(),因爲這樣可以避免增加內存碎片,並且堆棧操作可能比堆訪問。

+1

「如果你想從函數返回一個數組,......,你必須使用...」並不完全正確 - static char a [size];返回一個;'也應該工作。 –

+0

@JoshuaGreen我沒有寫「你不能做'靜態字符a [大小];'」,我寫道「你不能做'char a [size];'」... – 2012-12-16 14:36:26

+0

@JoshuaGreen在其他用static關鍵字聲明一個數組不會導致自動數組,因爲它的存儲時間是靜態的... – 2012-12-16 14:37:45