【发布时间】:2014-08-06 00:13:11
【问题描述】:
所以,我正在解决 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 工作得很好。所以引擎盖下发生了什么。
问候。
【问题讨论】:
-
stackoverflow.com/questions/11977316/… 在分配问题上有一些有用的 cmets
-
在第二次尝试中,除了将
sum1和sum2声明移到main()之外之外,应用程序中是否还有其他变化?
标签: c memory-management