C编程,为什么这个大型数组声明会产生分段错误?

时间:2010-06-16 00:06:06

标签: c arrays integer

此代码在数组声明期间产生分段错误。我很困惑为什么会这样。我故意选择2000000000作为值,因为它低于2 ^ 31并且可以适合整数变量。

int main()
{

    int  nums_size = 2000000000;

    int nums[nums_size];

    int i;
    for(i = 0; i < nums_size; i++) {
        nums[i] = i;
    }


    return 0;

}

6 个答案:

答案 0 :(得分:21)

嗯,首先,这是20亿个整数。如果你的32位地址空间和int在你的平台上有四个字节的大小(通常是32位平台),那么你就不能存储那么多的整数。

即使如此,你在堆栈上只有很多可用的空间,这是自动变量所在的位置。

如果你需要一个非常大的数组,你应该使用malloc()进行dyncamically分配(如果这样做,请确保在完成后使用free()释放它!)。< / p>

答案 1 :(得分:4)

int  nums_size = 2000000000;

int nums[nums_size];

并不意味着2000000000字节的整数,它意味着200,000个int类型的元素,这在32位平台上意味着你消耗了近8GB的内存 - 这是不可能的。

答案 2 :(得分:3)

您正在堆栈上分配一个巨大的数组。实际上,没有C / C ++编译器可以正确处理它。

您可以将它移动到全局变量中(它将通过在编译时映射可执行文件中的内存来静态分配空间),或者切换到malloc'd数组。

当然,这仍然是一次性要求的大量内存,但至少我提到的方法将避免立即段错误。

答案 3 :(得分:2)

在堆栈上分配局部变量。提供给应用程序的固定数量的堆栈空间(通常为1MB-8MB,因OS而异)。一般规则是使用malloc()来分配大量数据。

答案 4 :(得分:1)

您的问题的答案很简单:stackoverflow。不,不,不是网站,而是“溢出堆栈”的实际过程。您没有足够的stack来存储该数组。就如此容易。在内存受限的系统上执行此操作纯属疯狂。另请参阅this question

答案 5 :(得分:0)

这个版本在我的电脑上正常运行:

const int nums_size = 2000000000;
int nums[nums_size];

int main()
{
    int i;
    for(i = 0; i < nums_size; i++) {
        nums[i] = i;
    }

    return 0;
}

(好吧,老实说。开始很好,但很快就会进行交换。)