为什么此代码会出现分段错误?我正在使用code :: blocks。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a[555555];
}
答案 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::array
或std::vector
而不是纯C数组。