此代码在数组声明期间产生分段错误。我很困惑为什么会这样。我故意选择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;
}
答案 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;
}
(好吧,老实说。开始很好,但很快就会进行交换。)