为什么此代码会给运行时分段带来错误?

时间:2014-02-08 15:52:34

标签: c++ stack-overflow

为什么此代码会出现分段错误?我正在使用code :: blocks。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
     int a[555555];
}

5 个答案:

答案 0 :(得分:10)

这就是所谓的stack overflow 通常堆栈大小很小,你不能在堆栈上分配如此大的内存 为此,程序员在堆上分配它(使用dynamic allocation)。在C中,您可以使用malloc家庭功能

int *a = malloc(sizeof(int)*55555); // Use free(a) to deallocate

在C ++中,您可以使用new运算符

int *b = new int[555555];   // Use delete [] to deallocate

答案 1 :(得分:4)

因为你试图在堆栈上分配超过2MB(之前我在数学上失败并认为它是2GB)的内存,然后将堆栈分配。

注意:对于Windows,特定线程的默认堆栈大小为1MB,而在Gnu / linux上,您可以使用ulimit -s命令找到堆栈大小值。

答案 2 :(得分:3)

你到了正确的地方提问。 ;)

数组很大并且存在于堆栈中。代码崩溃,因为它耗尽了有限的堆栈空间。

如果在堆上分配a,问题可能会消失。

答案 3 :(得分:0)

正如其他人已经告诉过你的那样,你正在尝试在堆栈中分配大量内存,这个空间通常非常有限。

参见例如:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
     int a[555555];
     int* b = new int[555555];

     delete [] b;
}

在snipped中,你有两个整数数组,一个在堆中分配,另一个在堆栈中分配。

在这里你可以找到关于堆和堆栈之间的区别的一些解释:

What and where are the stack and heap? http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

答案 4 :(得分:0)

我对你的代码有一些考虑 首先,现代编译器会认识到a未被使用,然后它将被丢弃 但是,如果将某个值放入某个位置,则会分配a,即使它大于堆栈大小。内核不允许你这样做:这就是你获得SIGSEGV的原因 最后,您应该依赖std::arraystd::vector而不是纯C数组。