C++代码触发vector subscript out of range line1475错误调试求助
错误触发逻辑
vector subscript out of range是C++标准库vector的越界访问报错,提示的line1475是STL vector实现源码的行号,不是你的业务代码行号,本质原因是你在代码中访问了超出vector实际长度的下标位置。
代码问题排查
1. subVector函数越界点
借位逻辑的while循环没有做边界判断:
int k = 1; while (res[i + k] == 0) k++;
如果从i+1开始到vector末尾全是0,k会一直递增到i+k >= res.size(),此时访问res[i+k]直接触发越界。
后续借位操作res[i + j + 1]--也存在相同的越界风险,同时该函数默认a代表的数值大于等于b,如果没有做前置合法性判断,当a比b小时,最高位借位也会触发越界。
2. addVector函数越界点
进位处理的while循环同样缺少边界判断:
int k = i + 1; while (ans[k] >= 10) { ans[k + 1] += ans[k] / 10; ans[k] %= 10; k++; }
即使初始化时给ans开了max(a.size(),b.size())+1的长度,依然存在最高位连续进位的场景(比如999+2=1000,原开长度是3+1=4,索引最大值为3,当k=3时访问k+1=4就超出了vector长度),触发越界。
修复方案
修复后的subVector
vector<int> subVector(const vector<int>& a, const vector<int>& b) { // 可根据需求补充a < b时的符号处理逻辑,此处默认输入a >= b合法 vector<int> res = a; for (int i = 0; i < res.size() && i < b.size(); i++) { if (res[i] < b[i]) { int k = 1; // 增加边界判断,防止越界 while (i + k < res.size() && res[i + k] == 0) k++; for (int j = 0; j < k; j++) { res[i + j + 1]--; res[i + j] += 10; } } res[i] -= b[i]; } return res; }
修复后的addVector
vector<int> addVector(const vector<int>& a, const vector<int>& b) { vector<int> ans; // 多开1位空间,避免最高位连续进位越界 ans.resize(max(a.size(), b.size()) + 2); for (int i = 0; i < a.size(); i++) ans[i] = a[i]; for (int i = 0; i < b.size(); i++) { ans[i] += b[i]; ans[i + 1] += ans[i] / 10; ans[i] = ans[i] % 10; int k = i + 1; // 增加边界判断 while (k < ans.size() && ans[k] >= 10) { ans[k + 1] += ans[k] / 10; ans[k] %= 10; k++; } } // 可选:如果是低位在前存储数字,可去除末尾前导零缩小返回体积 while (ans.size() > 1 && ans.back() == 0) ans.pop_back(); return ans; }
通用排查技巧
- 所有访问
vec[index]的位置都提前判断index < vec.size() - 涉及循环修改下标的场景,每次迭代都做边界校验
- 调试阶段可以用
vec.at(index)代替[]访问元素,触发越界时会抛出更明确的异常,直接定位到出错的业务代码行
内容的提问来源于stack exchange,提问作者Thuận Quang
相关产品推荐
相关产品推荐

