这种情况下为什么会出现“segmentation fault”

时间:2021-05-17 06:36:08

标签: segmentation-fault malloc allocation

在这种情况下会出现“分段错误”

#define MAX_NODE 200001
#define MAX_DP 19

using namespace std;

int main()
{
    int next[MAX_NODE][MAX_DP];
    return 0;
}

但是,这种情况不会发生

#define MAX_NODE 200001
#define MAX_DP 19

using namespace std;

int main()
{
    int **next = (int **)malloc(MAX_NODE * sizeof(int *));
    for (int i = 0; i < MAX_NODE; i++)
    {
        next[i] = (int *)malloc(MAX_DP * sizeof(int));
    }
    return 0;
}

是什么造成了这种情况?

g++ 版本: Apple clang 版本 12.0.0 (clang-1200.0.32.29) 目标:x86_64-apple-darwin20.3.0 线程模型:posix

1 个答案:

答案 0 :(得分:1)

你的堆栈溢出了。堆栈空间有限,这就是为什么应该在堆 (new) 上分配大对象的原因。

int next[MAX_NODE][MAX_DP]; 创建了超过 10 MB 的堆栈分配,这肯定大于平均堆栈大小。