2010-06-29 88 views
1

我得到一個segfault從下面這行代碼:爲什麼在C中聲明一個大數組會導致段錯誤?

int fatblob[1820][286][5]; 

這是爲什麼?

+1

[在聲明大數組時遇到堆棧溢出異常]可能的重複(http://stackoverflow.com/questions/571945/getting-a-stack-overflow-exception-when-declaring-a-large-array ) – 2010-06-29 20:09:54

+0

可能的重複[在C++中創建一個大數組](http://stackoverflow.com/questions/3137598/create-a-big-array-in-c) – bk1e 2010-06-30 04:57:45

回答

7

您正在嘗試分配1820 * 285 * 5 * sizeof(int)字節=大約10MB(如果是sizeof(int) == 4)。這可能比您的操作系統默認情況下爲您提供堆棧分配的字節數多,因此會出現堆棧溢出/段錯誤。

您可以通過在創建線程,在堆上分配或更改OS默認值時要求額外堆棧來解決此問題。

8

由於您的堆棧段較小,因此1820*285*5int s。它通常在1MB附近。

+2

* sizeof(int),超過9MB在一個理智的,32位系統。 – 2010-06-29 19:48:33

+0

是的,謝謝丹。 – 2010-06-29 19:54:55

3

因爲堆棧溢出。嘗試在堆上分配該數組。

+0

+1用於引用堆棧溢出時的堆棧溢出。 – 2010-06-29 19:51:53

1

C中的自動變量(默認類型)通常分配在堆棧上。堆棧是爲每個線程分配的內存區域,雖然它可能會在許多操作系統上增長,但它的大小始終有限。 danben's answer很好地覆蓋了默認堆棧,但如果您使用線程,則會在線程創建中分配新的線程(例如,pthread_attr_setstacksize)。一般來說,大堆分配最好在堆上完成(malloc/new),但有時甚至可能太小。然後mmap()或類似的幫助。

danben的回答去了哪裏?它鏈接到some information on stack limits

3
int fatblob[1820][286][5]; 

你想分配180 * 286 * 5 * 4的內存位置(整型讓大小= 4)大約是9.8 MB,所以存在具有更小的缺省堆棧大小的可能性,你的OS。

LINUX具有8192 KB(即8 MB)的堆棧大小。所以很明顯,如果你試圖在堆棧上分配更多的內存,你會得到一個堆棧溢出。

您可以嘗試更改操作系統的堆棧大小。 在Linux下,你可以嘗試的ulimit

的ulimit -s < whateversize你希望它是>

$的ulimit -s 1024

我希望它會幫助你。

相關問題