簡體   English   中英

大程序導致C程序崩潰

[英]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>頭中使用malloccalloc函數在堆上分配它(特別是在已知數組索引的大小在運行時時特別有用)。

請注意,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中的默認堆棧大小為( 根據此網頁 );

  • Linux1.8MB | 1,872KB | 1,916,928 bytes

  • Windows1MB | 1,024KB | 1,048,576 bytes


擴展在rohit的回答( 本來我只是打算寫評論,但它是多寫了一個評論,我必須在最后的解決方案 ),如果你的數組有3,200,320 bytes | 3,125KB | 3MB

每個平台上堆棧溢出的大小將是;

  • Linux3,125KB - 1,872KB = 1,253KB | 1,283,072 bytes溢出。

  • Windows3,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.

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