我正在尝试运行涉及大量计算和值的模拟。
我遇到一个问题,即大型数组导致程序在声明任何变量之前崩溃。我不确定这是由于我的代码还是由于我的操作系统拒绝运行该程序。
崩溃程序的代码是:
long double adsorption[2][4][5][10001]
这个数组应该使用大约10 ^ 6个字节,而SIZE_MAX是10 ^ 19,所以我很困惑它为什么会崩溃。 (程序在任务管理器中为64位)
我正在使用12 Gb内存的Windows 7 64位运行,其中10 Gb通常是免费的。编译器是MinGW-w64
道歉,如果这是非常基本的,我来自物理背景,而不是编码!
干杯
答案 0 :(得分:2)
adsorption
正在堆栈上分配,它必须溢出堆栈。因此错误。
使用malloc
和系列在堆上分配大块数据。
修改强>
或者让它静止 - @Matt McNabb谢谢! : - )
答案 1 :(得分:0)
局部变量隐含地具有自动存储持续时间,因此它们被有效地放置在空间有限的堆栈中。要么使用static
限定符声明数组,将其移动到全局范围内,在任何函数之外(所以现在隐含地具有静态存储持续时间,哪些变量放在数据段上,注意{{1在这个上下文中意味着完全不同的东西,所以不要在那里“显而易见”,或者使用static
标头中的malloc
或calloc
函数将它分配到堆上(如果数组索引的大小已知运行时,则特别有用。
请注意,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
。