2016-12-05 42 views
1

我遇到了一個問題,我需要做一些大數據處理並創建太大的數組似乎導致Segmentation fault (core dumped)。這是問題的一個複製:太大的嵌套數組導致分段錯誤(核心轉儲)

int main() { 
struct { char a[2000][12] } b[2000]; 
return 0; } 

我使用的Archlinux 64位,cc作爲一個編譯器,ulimit -s返回8192這是奇怪的,因爲我有24GB的RAM。任何想法如何解決這個問題?我認爲它與stackheap有關,但我不知道這些是什麼。

+2

這是堆棧溢出! –

+1

@KirillBulygin此網站已達到其目的,並將關閉。 – nicomp

+0

您需要從堆中分配。堆棧大小通常限制在1MB左右。閱讀malloc/free。 – OldProgrammer

回答

1

基本上你試圖在堆棧上分配2000 * 12 * 2000/1024 = 46875 KB,但只允許使用8192 KB。快速解決方法是設置ulimit -s 50000

總之約stackheap:堆棧是每個函數調用的專用存儲器(這就是函數變量的內容駐留,即標量值,地址等),和堆是一個公共存儲器與一般不太嚴格限制(見例如malloc(3))。

+0

什麼會導致更快的程序:增加堆棧大小或做某種動態內存分配? – ChiseledAbs

+0

就速度而言,這些方法實際上是相同的,但是在堆棧上分配大內存是錯誤的,部分原因是在函數調用結束後偶然使用內存(並且內存內容將被其他數據損壞),也是因爲你必須調用'ulimit(1)'或'ulimit(2)'來擴展堆棧的大小(並且在一些非桌面架構上也不可能有大堆棧)。 –

1
ulimit -s 

不返回總RAM大小。它只返回當前shell可用的堆棧大小(以及它可以創建的所有進程)。所以,可用的RAM大小並不重要。

您可以使用ulimit -s unlimited來增加它。但是我建議使用動態內存分配來處理這樣的大型數組,因爲你的數組大小約爲48MB,如果在堆棧上不可用,你很容易遇到麻煩,主要是因爲「堆棧分配」失敗難以檢測。

1

通過使用局部變量聲明數組來使用堆棧內存。使用你的堆與內存分配:

typedef struct { 
    char a[2000][12]; 
} bigArray; 

int main(void) { 
    bigArray *array; 
    array = (bigArray*)malloc(2000 * sizeof(bigArray)); 

    // Do stuff with array here 

    free(array); 
    return 0; 
}