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
相关产品推荐
相关产品推荐

