C++访问二维vector出现Segmentation Fault与out_of_range异常问题
问题原因
- 输入的行数据未存入
mine数组:外层循环中创建的临时row变量存储了每行输入的字符,但循环结束后没有将row添加到mine中。你初始化vector <vector<char>> mine(n)仅给外层vector创建了n个空的char vector,每个内层vector的长度都是0,因此访问mine.at(0).at(0)时会触发越界异常。 - 循环变量重名:外层循环变量为
i,内层循环又定义了同名的i,会遮蔽外层的循环计数,属于潜在逻辑错误,可能导致循环执行异常。 - 存在非法下标访问:vector的合法下标范围为
[0, 容器长度-1],-1、超出实际数组长度的3都属于非法下标。at()成员函数会主动做边界检查,遇到非法下标直接抛出异常;[]运算符不做边界检查,遇到非法下标会直接触发段错误。
修复方案
完整修复代码
#include <iostream> #include <vector> using namespace std; int main() { int m, n; cin >> m >> n; vector<vector<char>> mine; // 预分配外层vector空间,优化性能 mine.reserve(m); for(int i = 0; i < m; i++) { vector<char> row; row.reserve(n); // 内层循环改用j作为变量名,避免遮蔽外层循环变量 for(int j = 0; j < n; j++) { char x; cin >> x; row.push_back(x); } // 将输入完成的行数据存入二维vector mine.push_back(row); } // 仅访问合法范围内的下标 if(m >= 1 && n >= 1) { cout << mine.at(0).at(0) << endl; } // 访问最后一个元素推荐直接调用back()方法,无需手动计算下标 if(!mine.empty() && !mine.back().empty()) { cout << mine.back().back() << endl; } if(m > 3 && n > 3) { cout << mine.at(3).at(3) << endl; } return 0; }
核心修改点说明
- 外层循环每生成一行完整的
row后,调用mine.push_back(row)将行数据存入二维vector,保证mine中每个内层vector都有合法数据 - 内层循环变量改为
j,避免和外层循环的i重名导致逻辑错误 - 所有下标访问前先判断容器长度是否符合要求,避免非法下标访问。如果需要访问容器最后一个元素,直接调用
back()成员函数即可,不要使用-1作为下标 - 可选优化:初始化时直接指定vector大小
vector<vector<char>> mine(m, vector<char>(n)),后续可以直接用下标赋值,无需调用push_back
内容的提问来源于stack exchange,提问作者GuruRandapa
相关产品推荐
相关产品推荐

