簡體   English   中英

在分配staticaly一個int數組時的Segfault

[英]Segfault while allocating staticaly an int array

如果我這樣做

int wsIdx [length];

我有一個segFault

但如果我這樣做

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

這里沒有問題。

只有在我的測試期間長度很高,2560000時才會出現此問題。 我有足夠的記憶力。 你能解釋一下這兩種分配方法之間的區別,以及為什么第一種方法不起作用? 謝謝。

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

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

這個SO討論可能會有所幫助: 堆棧和堆的內容和位置是什么?

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

旁白 :你可能喜歡在這個問題的背景下閱讀這個 ,特別是這部分 :)

假設length不是常數,那么第一種形式是可變長度數組 (VLA),您剛剛遇到了它們最大的問題之一。

最佳做法是避免使用“大型”數組的VLA,並使用malloc ,原因有兩個:

  1. 除了崩潰或導致其他一些未定義的行為之外,沒有任何機制可以報告分配失敗。

  2. 通常在堆棧上分配VLA,其通常在尺寸上相對有限。 所以它未能分配的可能性要高得多!

隱含的auto被認為有害

為了同意已經給出的答案,如果錯誤代碼是使用顯式存儲類編寫的,則這個常見問題可能更為明顯。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM