C程序与大型数组崩溃

时间:2014-07-17 11:51:02

标签: c arrays gcc

我正在尝试运行涉及大量计算和值的模拟。

我遇到一个问题,即大型数组导致程序在声明任何变量之前崩溃。我不确定这是由于我的代码还是由于我的操作系统拒绝运行该程序。

崩溃程序的代码是:

long double adsorption[2][4][5][10001]

这个数组应该使用大约10 ^ 6个字节,而SIZE_MAX是10 ^ 19,所以我很困惑它为什么会崩溃。 (程序在任务管理器中为64位)

我正在使用12 Gb内存的Windows 7 64位运行,其中10 Gb通常是免费的。编译器是MinGW-w64

道歉,如果这是非常基本的,我来自物理背景,而不是编码!

干杯

4 个答案:

答案 0 :(得分:2)

adsorption正在堆栈上分配,它必须溢出堆栈。因此错误。

使用malloc和系列在上分配大块数据。

修改

或者让它静止 - @Matt McNabb谢谢! : - )

答案 1 :(得分:0)

局部变量隐含地具有自动存储持续时间,因此它们被有效地放置在空间有限的堆栈中。要么使用static限定符声明数组,将其移动到全局范围内,在任何函数之外(所以现在隐含地具有静态存储持续时间,哪些变量放在数据段上,注意{{1在这个上下文中意味着完全不同的东西,所以不要在那里“显而易见”,或者使用static标头中的malloccalloc函数将它分配到堆上(如果数组索引的大小已知运行时,则特别有用。

请注意,C99还具有可变长度数组(VLA),其中索引的大小由运行时确定,但这些仅限于自动存储持续时间。

答案 2 :(得分:0)

2 * 4 * 5 * 10001 = 400,040个元素。 Double表示每个元素8个字节。 400,040 * 8 = 3,200,320字节

3,200,320字节大小超出了要处理的堆栈内存大小。

答案 3 :(得分:0)

它是一个堆栈溢出。

请记住;

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中的默认堆栈大小为(根据this webpage );

  • 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