[英]C Program crashing with large arrays
我正在嘗試運行一個涉及大量計算和值的模擬。
我有一個問題,就是大型數組會導致程序在聲明任何變量之前就崩潰了。 我不確定這是由於我的代碼還是由於我的操作系統拒絕運行該程序。
使程序崩潰的代碼是:
long double adsorption[2][4][5][10001]
這個數組應該使用大約10 ^ 6字節,而SIZE_MAX是10 ^ 19,所以我對它崩潰的原因感到困惑。 (程序在任務管理器中為64位)
我在具有12 Gb內存的Windows 7 64bit上運行,其中10 Gb通常是免費的。 編譯器為MinGW-w64
抱歉,如果這很基礎,我來自物理學背景,而不是編碼!
干杯
adsorption
分配在堆棧上 ,並且必須溢出堆棧。 因此,錯誤。
使用malloc
和family在堆上分配大塊數據。
編輯
或者將其設為靜態-@Matt McNabb謝謝! :-)
局部變量隱式具有自動存儲期限 ,因此它們有效地放置在空間有限的堆棧中。 要么使用static
限定符聲明數組,然后將其移至全局范圍,然后移至任何函數之外(所以現在隱式地具有靜態存儲期限 ,該變量位於數據段中,請注意,在這種情況下, static
意味着完全不同,因此不要或在<stdlib.h>
頭中使用malloc
或calloc
函數在堆上分配它(特別是在已知數組索引的大小在運行時時特別有用)。
請注意,C99還具有可變長度數組(VLA),其中索引的大小由運行時確定,但是這些僅限於自動存儲持續時間。
2 * 4 * 5 * 10001 = 400,040個元素 Double表示每個元素8個字節 。 並且400,040 * 8 = 3,200,320字節
3,200,320字節大小超出了要處理的堆棧內存大小。
這是堆棧溢出。
銘記;
1 byte = n bits
1 kb = 1024 bytes = 2^10 bytes
1 mb = 1024 kb = 2^20 bytes
1 gb = 1024 mb = 2^30 bytes
1 tb = 1024 gb = 2^40 bytes
假設gcc中的默認堆棧大小為( 根據此網頁 );
Linux : 1.8MB
| 1,872KB
| 1,916,928 bytes
Windows : 1MB
| 1,024KB
| 1,048,576 bytes
擴展在rohit
的回答( 本來我只是打算寫評論,但它是多寫了一個評論,我必須在最后的解決方案 ),如果你的數組有3,200,320 bytes
| 3,125KB
| 3MB
每個平台上堆棧溢出的大小將是;
Linux : 3,125KB - 1,872KB = 1,253KB
| 1,283,072 bytes
溢出。
Windows : 3,125KB - 1,024KB = 2,101KB
| 2,151,424 bytes
溢出。
要使gcc用更大的堆棧(例如8MB)編譯程序,您可以執行;
gcc file.c -Wl,--stack,8388608
而且程序不會溢出,因為在將數組放入堆棧后,您將剩下:
8,388,608 - 3,200,320 = 5,188,288 bytes
| 5,066KB
| 4.9MB
的堆棧空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.