在C中创建数组时出现分段错误

时间:2011-09-24 19:38:44

标签: c++ c arrays segmentation-fault stack-overflow

我最近迁移到新的笔记本电脑 - HP dv6119tx(Intel Core i5,4 GB RAM)。它安装了Windows 7 Home Premium 64位。

我正在尝试用C ++(Dev C ++)创建一个长度为10 ^ 6的int类型的数组,我曾经在上一台笔记本电脑上轻松创建(32位Windows 7旗舰版/ Ubuntu Linux,2GB) RAM)和我编程的所有其他环境(它应该占用大约3.5 MB的RAM)。但是使用当前设置,我在调试模式下出现“分段错误”错误。

Screenshot when I am trying to create an array of length 10^5

Screenshot when I am trying to create an array of length 10^6

屏幕截图(编辑):
第一个屏幕截图显示10 ^ 5处理当前设置而10 ^ 6没有。我没有在我最后一台机器上运行10 ^ 6的屏幕截图,但我已多次使用它。

修改
如果我将数组声明为 global ,或者在堆上动态创建它,该程序将正常工作

int* a = new int[MAX];  

但是我无法理解的是,当本地阵列在堆栈上占用少量3.5 MB内存(并且在2 GB机器上工作正常)时,为什么这个问题会出现在4GB机器上呢?这是用户堆栈空间问题吗?可以手动增加吗?

编辑2:
我特别提出这个问题,因为我已经在SPOJ上提交了许多解决方案,在堆栈上创建了10 ^ 6大小的数组。根据我目前的设置,我感到瘫痪无法做到这一点。我希望尽可能堆栈堆栈,因为它没有内存泄漏问题;和全局变量的局部变量,因为它们很整洁并且不会弄乱命名空间。

3 个答案:

答案 0 :(得分:9)

四兆字节的堆栈非常大。 Windows上的默认大小为1MB。您需要使用链接器的/STACK选项来要求更大的尺寸。

答案 1 :(得分:8)

像这样创建的数组存储在堆栈中。但是,堆栈的大小非常有限,因此您遇到堆栈溢出和崩溃。

这样做的方法是在堆上分配它:

int *a = (int*)malloc(MAX * sizeof(int));

//  Do what you need to do.

//  Free it when you're done using "a".
free(a);

答案 2 :(得分:2)

您可以将缓冲区指定为static,而不是使用malloc'ating内存。 E.g:

static int a[MAX];

这种方法的优点是您无需跟踪内存分配。