在全局范围内声明二维向量会导致分段错误

时间:2021-05-25 06:21:28

标签: c++ arrays vector graph

#include <bits/stdc++.h>

using namespace std;

int n;
std::vector<bool> visited(n,false);
std::vector<std::vector<int>> g(n,std::vector<int>(n));


int main() {
    cin>>n;
    //std::vector<std::vector<int>> g(n,std::vector<int>(n));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cin>>g[i][j];
        }
    }
    cout<<g[0][0];

}

在 main 函数中声明的二维向量没有错误,但在全局范围内声明时会出现 SIGSEV 错误

1 个答案:

答案 0 :(得分:1)

visitedg 被初始化时,n 的值为 0。 (n 在全局命名空间中声明并且将是 zero-initialized。)所以 vector 是空的并且不包含任何元素。然后像 g[0][0] 一样访问它们会导致 UB。

另一方面,对于g中声明的向量main()n被设置为某个值,然后用于初始化g,然后{{1} } 被初始化为包含 g 元素。