我最近迁移到新的笔记本电脑 - 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)。但是使用当前设置,我在调试模式下出现“分段错误”错误。
屏幕截图(编辑):
第一个屏幕截图显示10 ^ 5处理当前设置而10 ^ 6没有。我没有在我最后一台机器上运行10 ^ 6的屏幕截图,但我已多次使用它。
修改
如果我将数组声明为 global ,或者在堆上动态创建它,该程序将正常工作
int* a = new int[MAX];
但是我无法理解的是,当本地阵列在堆栈上占用少量3.5 MB内存(并且在2 GB机器上工作正常)时,为什么这个问题会出现在4GB机器上呢?这是用户堆栈空间问题吗?可以手动增加吗?
编辑2:
我特别提出这个问题,因为我已经在SPOJ上提交了许多解决方案,在堆栈上创建了10 ^ 6大小的数组。根据我目前的设置,我感到瘫痪无法做到这一点。我希望尽可能堆栈堆栈,因为它没有内存泄漏问题;和全局变量的局部变量,因为它们很整洁并且不会弄乱命名空间。
答案 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];
这种方法的优点是您无需跟踪内存分配。