2012-07-21 91 views
4

如果我爲此段錯誤而分配staticaly int數組

INT wsIdx [長度];

我有段錯誤

,但如果我這樣做

int *wsIdx; 
wsIdx = (int *)malloc(sizeof(int) * length); 

沒有任何問題。

只有當長度很高時,纔會出現此問題,在我的測試過程中出現2560000。我的記憶足夠廣泛。你能否向我解釋兩種分配方法之間的差異,以及爲什麼第一種方法不起作用?謝謝。

+4

您來到這個問題的正確網站。 – 2012-07-21 12:25:13

+0

:-)我注意到了! – Gael 2012-07-21 12:45:43

回答

5

第一個在「堆棧」(通常用於局部變量的區域)上分配,第二個在「堆」上分配給動態分配的內存區域。

您沒有足夠的堆棧空間以第一種方式分配,堆很大。

這個SO討論可能會有幫助:What and where are the stack and heap?

當您動態分配內存時,您可以通過檢查malloc/calloc/etc的返回值來檢查分配的成功與否。不幸的是,在堆棧上分配內存時不存在此類機制。

除了:您可能喜歡閱讀this在這一問題的範圍內,特別是this part :)

+0

謝謝你的快速和良好的答覆,併爲您的鏈接。我要讀它! – Gael 2012-07-21 12:28:15

3

假設length不是恆定的,則第一種形式是一可變長度數組(VLA) ,而你剛剛遇到了他們最大的問題之一。

最佳做法是避免沃拉斯的「大」數組,並使用malloc代替,原因有二:

  1. 沒有機制讓他們彙報分配失敗,比其他的崩潰或導致一些其他未定義的行爲。

  2. VLA通常分配在堆棧上,堆棧的大小通常相對有限。所以它沒有分配的機會要高得多!

+0

你說得對,長度不是一個常量,所以我將使用'malloc' – Gael 2012-07-21 12:29:33

1

隱含auto認爲是有害的

要與已經給出的答案同意,如果出錯的代碼已經寫有明確的存儲類,這個共同的問題可能會更明顯。

void 
not_enough_stack(void) 
{ 
    auto int on_stack[2560 * 1000]; 
    printf("sizeof(stack) %d\n", sizeof(on_stack)); 
}