C++ C+中的奇怪分段错误+;主程序之前的程序

C++ C+中的奇怪分段错误+;主程序之前的程序,c++,linux,segmentation-fault,C++,Linux,Segmentation Fault,在一些内存测试中,我从以下程序中得到一个segfault: #include <string> #include <iostream> using namespace std; int main() { cout << "Beginning Test" << endl; const int N = 2000000; string sArray[N]; return 0; } #包括 #包括 使用名称空间std

在一些内存测试中,我从以下程序中得到一个segfault:

#include <string>
#include <iostream>
using namespace std;

int main()
{
    cout << "Beginning Test" << endl;
    const int N = 2000000;  
    string sArray[N];
    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{

cout堆栈溢出,由于某些原因,输出没有刷新。2M
字符串
s内存相当大。请尝试使用
而不是
堆栈

最好的方法是使用
向量
而不是数组,不要再担心手动分配。

堆栈溢出

你是故意的,不是吗

string sArray[N];

可能耗尽了所有堆栈内存,从而导致它发生segfault。

发生的情况是,sArray对于主方法是本地的,因此它将在堆栈上进行分配。但是堆栈不足以容纳2000000个元素,因此它爆炸了


现在,编译器尝试在函数的最开始处(概念上,在“{”处)分配sArray,这就是为什么堆栈溢出发生在“开始测试”输出之前。

您刚刚得到堆栈溢出。 如果要在堆栈上分配大数组,则需要更改堆栈大小。
在这里查找指令

等等,您试图在堆栈上分配2MB*sizeof(字符串)?lol,但是为什么堆栈这么小?sizeof(字符串)=8,所以2000000*8=16MB。这意味着堆栈大小大于8MB,小于16MB,但对我来说它看起来非常小(我在这台机器上有32GB ram)@JohnnyW堆栈很小,但程序可用的内存(数据和堆)非常大。是的,我知道这一点,但为什么堆栈大小如此有限?因为我们通常不需要太多堆栈,所以最好不要在不需要堆栈空间时浪费堆栈空间的部分地址范围。不要忘记每个线程都需要自己的堆栈,所以在任何给定时刻,您的机器上都有很多堆栈。我们不需要很多堆栈,因为我们从不在其中分配大对象。如果我们这样做了,那么就永远不会有任何数量的堆栈足够大。我们只需要将堆用于大对象,我们无论如何都必须使用它,因为有些事情无法用堆栈来完成。堆栈包含两个主要内容:自动v变量(你的大数组是)和函数参数。当一个函数调用另一个函数时,调用方的参数与被调用方的参数一起“推”到堆栈上,被调用方的参数也可以分配自动变量。被调用方完成后,其参数和自动存储被“弹出”如果堆栈空间不受限制,那么……考虑一下:
voidf(inti){f(i);}