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

使用普通for循环遍历二维vector触发segmentation fault的原因解析

最富客户财富值计算:段错误原因解析

我需要实现一个计算最富客户财富值的方法,也就是求二维vector矩阵中每行元素和的最大值。最初用普通for循环遍历的时候触发了segmentation fault,找不到原因;改用范围for循环后问题解决,想知道最初写法触发段错误的具体原因。

初始错误代码

class customers {
public:
    int maximumWealth(vector<vector<int>>& accounts) {
        int richest_customer_wealth = 0;
        int sum;
        for(int i=0;i<accounts.size();++i){
            sum = 0;
            for(int j=0;i<accounts[i].size();++j){
                sum += accounts[i][j];
            }
            if(sum > richest_customer_wealth)
                    richest_customer_wealth = sum;
        }
        return richest_customer_wealth;
    }
};

错误原因分析

段错误的根源是内层循环的条件写错了:内层循环原本应该判断j < accounts[i].size(),但代码中写成了i < accounts[i].size()。

这个错误会导致:

  • 内层循环的终止条件完全和j无关,只要i的值小于当前行的元素个数,循环就会一直执行,j不断自增
  • 当j超过当前行的元素下标范围(比如当前行只有3个元素,j到3时已经越界),代码还会继续访问accounts[i][j],这属于非法内存访问,直接触发segmentation fault
  • 如果i的值本身大于等于当前行的元素个数,内层循环条件一开始就不成立,不会执行,但只要存在某一行的元素个数大于i,就会出现无限循环+越界访问的情况

修改后的正确代码

class customers{
public:
    int maximumWealth(vector<vector<int>>& accounts) {
        int richest_customer_wealth = 0;
        int sum;
        for(vector<int> row: accounts){
            sum = 0;
            for(int val: row){
                sum += val;
            }
            if(sum > richest_customer_wealth)
                    richest_customer_wealth = sum;
        }
        return richest_customer_wealth;
    }
};

范围for循环会自动遍历容器的每个元素,不需要手动控制下标,从根源上避免了这种下标条件写错的问题,因此不会出现越界访问。

内容的提问来源于stack exchange,提问作者M. Khadka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:45:37