VS2019中向二维vector插入元素时触发Segmentation Fault错误
错误原因
段错误的核心原因是访问了未申请的非法内存:
- 你声明
vector<vector<int>> arr;时只创建了一个空的二维vector,内部没有任何元素,也没有分配对应大小的存储空间 - vector的
[]下标运算符不会自动扩容,你直接执行cin >> arr[i][j]相当于直接读写不存在的内存位置,触发内存访问违规,在VS下会报调试断言错误,在Linux/在线编辑器环境就会触发Segmentation Fault。
修复方法
两种常用修复方式二选一即可:
- 方式一:初始化vector时直接指定大小
读取完边长num之后,直接把二维vector初始化为num行、每行num个int元素的结构,之后就可以正常用下标访问:
#include <iostream> #include <vector> using namespace std; int main() { int num; cin >> num; // 初始化num行,每行存num个int,默认值为0 vector<vector<int>> arr(num, vector<int>(num)); for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { cin >> arr[i][j]; } } int ans = 0; for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { ans += arr[i][j]; } } cout << (ans == 0 ? "YES" : "NO"); return 0; }
- 方式二:动态追加元素
如果不想预先固定大小,可以在读取输入时逐行、逐元素用push_back往vector里追加内容,不要直接用下标访问未分配的位置:
#include <iostream> #include <vector> using namespace std; int main() { int num; cin >> num; vector<vector<int>> arr; for (int i = 0; i < num; i++) { vector<int> cur_row; for (int j = 0; j < num; j++) { int tmp; cin >> tmp; cur_row.push_back(tmp); } arr.push_back(cur_row); } int ans = 0; for (int i = 0; i < arr.size(); i++) { for (int j = 0; j < arr[i].size(); j++) { ans += arr[i][j]; } } cout << (ans == 0 ? "YES" : "NO"); return 0; }
注意:如果是已知固定大小的场景,第一种初始化时指定大小的方式效率更高,省去了动态扩容的额外开销。
内容的提问来源于stack exchange,提问作者Aatifa Khan
相关产品推荐
相关产品推荐

