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

此代码在数组声明期间产生分段错误。 我很困惑,为什么会发生这种情况。 我故意select2000000000作为一个值,因为它低于2 ^ 31,可以适应一个整数variables。

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

那么,一方面,这是20亿整数。 如果您有32位地址空间,并且int在您的平台上的大小为4个字节(对于32位平台而言通常是这样),则不能存储那么多整数。

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

如果你需要一个非常大的数组,你应该使用malloc()来进行语义分配(如果你这样做的话,一定要在使用free()free()它)。

 int nums_size = 2000000000; int nums[nums_size]; 

并不意味着20亿字节的整数,这意味着20亿个inttypes的元素,在32位平台上意味着你消耗了将近8GB的内存 – 这是不可能的。

你正在堆栈上分配一个巨大的数组。 几乎没有C / C ++编译器会正确处理。

你也许可以把它移到全局variables(它会在编译时通过在可执行文件中映射内存来静态分配空间),或者切换到一个malloc的d数组。

当然,这仍然是一个很大的要求,但至less我提到的方法将避免立即发生段错误

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

你的问题的答案很简单: stackoverflow 。 不,不,不是网站,而是“溢出堆栈”的实际过程。 您没有足够的堆栈来存储该数组。 就如此容易。 在内存受限的系统上这样做纯粹是疯狂的。 也看到这个问题 。

这个版本在我的电脑上运行良好:

 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; } 

(好吧,说实话,它开始很好,但很快就会进入交换。)