在 Global Scope 中声明 2D Vector 会产生分段错误
Declaring 2D Vector in Global Scope gives segmentation fault
#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 错误
当visited
和g
初始化时,n
的值为0
。 (n
在全局命名空间中声明,将是 zero-initialized。)所以 vector
是空的,不包含任何元素。然后像 g[0][0]
一样访问它们会导致 UB。
另一方面,对于在main()
中声明的向量g
,n
被设置为某个值,然后用于初始化g
,然后g
初始化为包含 n
个元素。
#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 错误
当visited
和g
初始化时,n
的值为0
。 (n
在全局命名空间中声明,将是 zero-initialized。)所以 vector
是空的,不包含任何元素。然后像 g[0][0]
一样访问它们会导致 UB。
另一方面,对于在main()
中声明的向量g
,n
被设置为某个值,然后用于初始化g
,然后g
初始化为包含 n
个元素。