所以,我正在解决 SPOJ 上的问题。我必须处理大量的订单 2 ^ 18 的值。我在的系统上公羊4 GB (2 ** 34字节)。在为我的程序分配内存时,我发现了一些奇怪的东西。我使用 long long 限定符将输入存储在两个数组sum1[1<<17]
和sum2[1<<17]
中。因此,两个数组分配的总内存为2^17*8 + 2^17*8 = 2^21 Bytes
。我想引用的代码是:
#include <stdio.h>
int main()
{
// some code
int a=17,b=17;
long long sum1[1<<a], sum2[1<<b];
// some more code
}
问题在于,每当a+b >= 34
,程序停止工作,否则它工作正常。我猜这是由于大空间不可用。但是,如果我将这两个数组全局化:
#include <stdio.h>
long long sum1[1<<18], sum2[1<<18];
int main()
{
// some code
}
效果很好而且不会对a+b <= 34
感到烦恼,因为你可以看到它适用于1<<18
。那么在幕后发生了什么。
问候。
答案 0 :(得分:2)
函数的局部变量进入堆栈。您的堆栈大小不足以容纳您的阵列。
其他信息:
您可以通过以下方式查看堆栈大小:
ulimit -s
答案 1 :(得分:2)
局部变量通常在堆栈上分配,并且大多数系统对堆栈帧的大小有相对较小的限制。大型数组应该是全局的,或者使用malloc()
动态分配。