c程序的内存问题

时间:2014-06-16 08:09:38

标签: c memory-management

所以,我正在解决 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。那么在幕后发生了什么。 问候。

2 个答案:

答案 0 :(得分:2)

函数的局部变量进入堆栈。您的堆栈大小不足以容纳您的阵列。

其他信息:

您可以通过以下方式查看堆栈大小:

ulimit -s

答案 1 :(得分:2)

局部变量通常在堆栈上分配,并且大多数系统对堆栈帧的大小有相对较小的限制。大型数组应该是全局的,或者使用malloc()动态分配。