【问题标题】:Memory issue with c programc程序的内存问题
【发布时间】: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 &gt;= 34 ,程序停止工作,否则它工作正常。我猜这是由于大空间不可用。但是,如果我像这样使两个数组成为全局数组:

#include <stdio.h>

long long sum1[1<<18], sum2[1<<18]; 

int main()
{
    // some code 

}

它工作得很好,不用担心 a+b &lt;= 34 ,你可以看到它对 1&lt;&lt;18 工作得很好。所以引擎盖下发生了什么。 问候。

【问题讨论】:

标签: c memory-management


【解决方案1】:

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

其他信息:

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

ulimit -s

【讨论】:

  • 没有完全解释为什么在全局声明数组时它会起作用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多