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

C++使用vector计算数组运行和时出现运行时溢出错误如何解决

错误根因

你遇到的是典型的vector下标越界引发的未定义行为,具体问题点有3个:

  • 循环起始下标错误:循环从i=0启动,第一次迭代就执行temp[i-1],也就是访问temp[-1]。vector的下标参数是无符号整型size_t,传入-1时会被转换为极大的无符号偏移值,直接触发UndefinedBehaviorSanitizer的无符号偏移溢出检测,也就是你看到的报错信息。
  • 初始值赋值方向写反:代码里nums[0] = temp[0]逻辑完全颠倒,temp创建时是全0初始化状态,这行代码不仅没给结果数组设置正确的初始值,还会篡改输入的nums数组首元素为0,污染原始输入。
  • 累加逻辑起始位置错误:前缀和(runningSum)的首元素和原数组首元素相等,累加逻辑只需要从第二个元素(下标1)开始执行即可,从0开始做累加本身就不符合算法逻辑。
修复代码

基础修复版(保留原输入数组,不修改入参)

class Solution {
public:
    vector<int> runningSum(vector<int>& nums) {
        vector<int> temp(nums.size());
        // 正确设置结果数组首元素
        temp[0] = nums[0];
        // 从下标1开始遍历,避免i-1越界
        for(int i = 1; i < nums.size(); i++){
            temp[i] = temp[i-1] + nums[i];
        }
        return temp;
    }
};

优化版(原地修改,空间复杂度O(1))

如果题目允许修改输入数组,可以直接在原数组上做累加,不需要额外开辟结果数组:

class Solution {
public:
    vector<int> runningSum(vector<int>& nums) {
        for(int i = 1; i < nums.size(); i++){
            nums[i] += nums[i-1];
        }
        return nums;
    }
};
补充说明
  • 报错信息里提到的stl_vector.h行号是C++标准库vector内部的下标访问检测位置,不是标准库本身有问题,根因永远是业务代码传入了非法的访问下标,遇到这类报错优先排查自己代码里的循环边界、下标计算逻辑即可。
  • 以上两个版本都自动处理了空数组的边界场景:传入空nums时不会进入循环,直接返回空vector,不会触发越界。

内容的提问来源于stack exchange,提问作者sakshi jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:48:43