You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:15:00