INT wsIdx [長度];
我有段錯誤
,但如果我這樣做
int *wsIdx;
wsIdx = (int *)malloc(sizeof(int) * length);
沒有任何問題。
只有當長度很高時,纔會出現此問題,在我的測試過程中出現2560000。我的記憶足夠廣泛。你能否向我解釋兩種分配方法之間的差異,以及爲什麼第一種方法不起作用?謝謝。
INT wsIdx [長度];
我有段錯誤
,但如果我這樣做
int *wsIdx;
wsIdx = (int *)malloc(sizeof(int) * length);
沒有任何問題。
只有當長度很高時,纔會出現此問題,在我的測試過程中出現2560000。我的記憶足夠廣泛。你能否向我解釋兩種分配方法之間的差異,以及爲什麼第一種方法不起作用?謝謝。
第一個在「堆棧」(通常用於局部變量的區域)上分配,第二個在「堆」上分配給動態分配的內存區域。
您沒有足夠的堆棧空間以第一種方式分配,堆很大。
這個SO討論可能會有幫助:What and where are the stack and heap?。
當您動態分配內存時,您可以通過檢查malloc/calloc/etc的返回值來檢查分配的成功與否。不幸的是,在堆棧上分配內存時不存在此類機制。
謝謝你的快速和良好的答覆,併爲您的鏈接。我要讀它! – Gael 2012-07-21 12:28:15
假設length
不是恆定的,則第一種形式是一可變長度數組(VLA) ,而你剛剛遇到了他們最大的問題之一。
最佳做法是避免沃拉斯的「大」數組,並使用malloc
代替,原因有二:
沒有機制讓他們彙報分配失敗,比其他的崩潰或導致一些其他未定義的行爲。
VLA通常分配在堆棧上,堆棧的大小通常相對有限。所以它沒有分配的機會要高得多!
你說得對,長度不是一個常量,所以我將使用'malloc' – Gael 2012-07-21 12:29:33
隱含auto
認爲是有害的
要與已經給出的答案同意,如果出錯的代碼已經寫有明確的存儲類,這個共同的問題可能會更明顯。
void
not_enough_stack(void)
{
auto int on_stack[2560 * 1000];
printf("sizeof(stack) %d\n", sizeof(on_stack));
}
您來到這個問題的正確網站。 – 2012-07-21 12:25:13
:-)我注意到了! – Gael 2012-07-21 12:45:43