可能重複:
Difference between declaration and malloc是malloc比聲明更好?
有什麼區別:
char * a = malloc(size);
和
char a[size];
是一個貝特比其他?使用malloc有什麼優勢嗎?
可能重複:
Difference between declaration and malloc是malloc比聲明更好?
有什麼區別:
char * a = malloc(size);
和
char a[size];
是一個貝特比其他?使用malloc有什麼優勢嗎?
您不控制堆棧分配內存的生命期範圍,它只在範圍內有效(除非使其爲靜態)。
malloc
用於在堆上分配內存。只有在該存儲器上撥打free
纔有效。
在堆棧上分配內存會更快,通常是因爲您實際上沒有分配新內存,而只是保留了更多已使用的內容,但不控制生命週期,它由您的區塊或功能的範圍。
非常感謝你的快速回答!你能給我一個malloc更好的例子嗎?如果它不要求太多,因爲我想知道在哪些情況下聲明會失敗 – user1907948
當沒有剩餘堆棧空間時,堆棧分配失敗,無限遞歸導致同樣的問題,堆棧溢出。堆分配使您可以訪問堆,它可能比您保留的堆棧空間大很多,但不是無限的或沒有問題。當你打算分享更長時間的東西時,請使用堆,但要注意諸如堆碎片之類的事情。 –
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()
,因爲這樣可以避免增加內存碎片,並且堆棧操作可能比堆訪問。
「如果你想從函數返回一個數組,......,你必須使用...」並不完全正確 - static char a [size];返回一個;'也應該工作。 –
@JoshuaGreen我沒有寫「你不能做'靜態字符a [大小];'」,我寫道「你不能做'char a [size];'」... – 2012-12-16 14:36:26
@JoshuaGreen在其他用static關鍵字聲明一個數組不會導致自動數組,因爲它的存儲時間是靜態的... – 2012-12-16 14:37:45
請注意,您希望'char a [size]'而不是指針。 – Pubby
一個是理智的,如果你不是一個絕對可怕的程序員,另一個會不可避免地導致破碎的代碼。 –