2009-12-04 59 views
79

以下代码在2Gb计算机上运行时给出了分段错误,但适用于4GB机器。大型阵列大小上的分段错误

int main() 
{ 
    int c[1000000]; 
    cout << "done\n"; 
    return 0; 
} 

该阵列的大小只是4Mb。在C++中可以使用的数组大小是否有限制?

回答

93

你可能只是在这里得到一个堆栈溢出。该数组太大而不适合您程序的堆栈地址空间。

如果你在堆上分配数组,你应该没问题,假设你的机器有足够的内存。

int* array = new int[1000000];

但请记住,这将需要你delete[]数组。更好的解决方案是使用std::vector<int>并将其大小调整为1000000个元素。

+0

感谢您的答案,但你能解释为什么数组分配在堆栈上,为什么不在主程序存储器。 – Mayank 2009-12-04 15:51:32

+9

给定的代码在堆栈上分配,因为它在编译时被指定为具有常数元素的数组。只有malloc,new等才会将值放在堆上。 – 2009-12-04 16:05:43

+3

所有自动变量都在堆栈中分配。如果你看看反汇编,你会看到从堆栈指针中减去局部变量的大小。当你调用malloc或calloc或任何内存函数时,函数会发现足够大的内存块以满足你的请求。 – rerun 2009-12-04 16:12:01

2

在这种情况下,您正在为堆栈分配数组,尝试使用alloc分配相同大小的数组。

46

在C或C++本地对象通常分配在堆栈上。你正在堆栈上分配一个大的数组,超过堆栈可以处理,所以你得到一个stackoverflow.

不要在堆栈上本地分配它,而是使用其他地方。这可以通过使对象全局或在全局上分配来实现。全局变量很好,如果你不使用任何其他编译单元。为了确保这不会偶然发生,请添加一个静态存储说明符,否则只需使用堆。

这将在BSS段,这是堆的一部分分配:

static int c[1000000]; 
int main() 
{ 
    cout << "done\n"; 
    return 0; 
} 

这将在数据段,这是堆的一部分太分配:

int c[1000000] = {}; 
int main() 
{ 
    cout << "done\n"; 
    return 0; 
} 

这会在某个不确定的位置在堆中分配:

int main() 
{ 
    int* c = new int[1000000]; 
    cout << "done\n"; 
    return 0; 
} 
+0

如果你使用第三种模式,在堆上分配,不要忘记在某个阶段删除[]指针,否则你会泄漏内存。或者研究智能指针。 – meowsqueak 2012-09-05 01:20:23

+6

@meowsqueak当然,最好的做法是在你用'new'分配的任何地方删除''。但是如果你确定只分配一次内存(就像在主内存中那样),那么这是绝对不需要的 - 即使没有明确的“delete”,内存也能保证在主内存中被释放。 – hirschhornsalz 2012-09-05 08:11:49

+0

'at'drhirsch(你怎么做一个人物?) - 是的,公平的评论。由于OP对于该语言而言似乎是新手,我只是想确保他们和其他任何看到您的良好答案的人都知道,如果一般情况下使用了第三种方法的含义。 – meowsqueak 2012-09-05 12:19:44

2

因为你的阵列存储在STA CK。你应该把它存储在堆中。请参阅this link以了解堆和堆栈的概念。

6

另外,如果你在大多数UNIX & Linux系统上运行,就可以暂时用下面的命令增加堆栈大小:

ulimit -s unlimited 

但要小心,内存是一种有限的资源,并以极大的力量来伟大责任:)

+0

这是解决方案,但我建议所有人在删除该程序堆栈大小的默认限制时非常谨慎。您不仅会遇到严重的性能下降,而且您的系统可能会崩溃。例如,我尝试在4GB内存的机器上用带有快速排序的16 000 000个整数元素排序数组,并且我的系统几乎被杀死。 LOL – rbaleksandar 2014-10-16 16:51:55

+0

@rbaleksandar我认为你~16MB的程序几乎杀死你的机器,因为你正在处理几个数组副本(可能每个函数调用一个?)尝试更多的内存感知实现;) – RSFalcon7 2014-10-16 23:20:17

+0

我很确定数组处理没关系,因为我是通过引用而不是按价值传递的。 bubblesort也会发生同样的情况。地狱,即使我的quicksort实施吸泡沫是你不可能错误地实现的东西。大声笑 – rbaleksandar 2014-10-17 10:07:47