使用普通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
相关产品推荐
相关产品推荐

