为什么这段代码会导致运行时分段错误?

5
为什么这段代码会导致分段错误?我正在使用code::blocks。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
     int a[555555];
}
5个回答

10

这就是所谓的堆栈溢出
通常堆栈大小很小,不能在堆栈上分配如此大量的内存。
为此,程序员使用动态分配在堆上分配内存。在C语言中,可以使用malloc族函数。

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

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

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

3
真巧啊 :) - ajay
3
他认为StackOverflow是方法,结果证明它就是答案。 :-) - Petr Skocik

4
因为您正在尝试在堆栈上分配超过2MB的位(先前我数学失败,以为是2GB),这将导致堆栈溢出。
注意:对于Windows,默认线程堆栈大小为1MB,在Gnu / linux上,您可以使用“ulimit -s”命令查找堆栈大小值。

2
他正在分配2MB,而不是2GB。 - twin
你和我对“像2GB”是什么意思有一些不同的看法。 - Petr Skocik
1
@twin 看来我在基本数学方面失败了。正在修复中。 - Xarn

3

你来对地方了,可以问问题啦。 ;)

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

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


0

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

例如:

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

     delete [] b;
}

在这段代码中,你有两个整数数组,一个在堆上分配,另一个在栈上分配。
在这里,你可以找到一些关于堆和栈之间区别的解释: 什么是堆和栈? http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接