LeetCode杨辉三角C++代码报int空指针引用绑定运行错误原因
LeetCode杨辉三角代码运行时错误原因
报错信息
Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
问题代码
vector<vector<int>> generate(int numRows) { vector<vector<int>> v(numRows); vector<int> q; for(int i=0;i<numRows;i++){ q.resize(i+1); q[0]=q[i]=1; for(int j=1;j<i;j++){ q[j]=v[i-1][j-1]+v[i-1][j]; } v.push_back(q); q.clear(); } return v; }
错误根因
触发空指针引用的核心问题是外层vector的初始化和后续写入逻辑不匹配:
- 代码第一行写
vector<vector<int>> v(numRows);时,会预先向v中插入numRows个空的vector<int>对象,此时v的长度已经是numRows,索引范围是0 ~ numRows-1,每个索引位置存的都是没有任何元素的空vector。 - 后续循环中使用
v.push_back(q)写入每一行的计算结果,是把新元素追加到v的末尾,而不是填充预分配的那些空位置。这就导致v[0]到v[numRows-1]始终是空vector,计算出来的杨辉三角行实际存在v[numRows]到v[2*numRows -1]的位置。 - 当循环到
i=1、第一次进入内层j循环时,代码尝试访问v[i-1]也就是v[0]的元素,而v[0]是空vector,访问不存在的int元素就会触发空指针绑定错误,属于未定义行为。 - 就算不触发运行时错误,最终返回的
v长度是2*numRows,前半段全是空vector,结果也完全不符合题目要求。
修复方案
二选一即可:
- 去掉外层vector的预分配长度,初始化为空vector:把第一行改成
vector<vector<int>> v;,后续push_back会按顺序把每一行存到正确的索引位置,访问v[i-1]时拿到的就是已经计算完成的上一行内容。 - 保留预分配逻辑的话,把写入逻辑从追加改成赋值:将
v.push_back(q);替换为v[i] = q;,直接填充预分配好的索引位置,不会出现空vector,也不会产生多余元素。
修正后可运行代码示例
vector<vector<int>> generate(int numRows) { vector<vector<int>> v; vector<int> q; for(int i=0;i<numRows;i++){ q.resize(i+1); q[0]=q[i]=1; for(int j=1;j<i;j++){ q[j]=v[i-1][j-1]+v[i-1][j]; } v.push_back(q); q.clear(); } return v; }
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

