LeetCode运行C++题解触发std::vector空指针引用运行时错误求助
错误根因分析
- 核心错误:你声明的
vector<vector<int>> result是初始化长度为0的空容器,代码中直接通过result[m][k]的方式对未申请的下标位置赋值,此时访问result[m]本身就是访问不存在的元素,触发空指针引用的运行时错误。你提到的「移除自定义比较函数就正常」和当前报错无关,当前提交的代码中不存在自定义比较函数,你可能混淆了不同代码段的报错场景。 - 次要有问题的写法:
int visit[n];属于C标准的变长数组,并非C++标准支持的语法,部分编译器虽然做了兼容但存在稳定性隐患,容易出现栈溢出或者初始化错误。
修复思路
- 每次需要新增分组时,先向
result中压入一个空的一维vector,再向这个新的一维vector中添加成员,不要直接通过下标赋值。 - 把变长数组
visit替换为C++标准的vector容器,初始化时直接赋值全0,无需调用memset。 - 元素插入统一使用vector的
push_back方法,避免手动维护下标带来的越界风险。
修复后可正常运行的代码
class Solution { public: vector<vector<int>> groupThePeople(vector<int>& groupSizes) { int n = groupSizes.size(); vector<int> visit(n, 0); // 替换非标准变长数组,初始化全为未访问 vector<vector<int>> result; for(int i = 0; i < n; i++) { if(visit[i] == 1) continue; // 新建分组 vector<int> curGroup; curGroup.push_back(i); visit[i] = 1; int targetSize = groupSizes[i]; // 匹配同组其他成员 for(int j = i + 1; j < n && curGroup.size() < targetSize; j++) { if(groupSizes[j] == targetSize && visit[j] == 0) { curGroup.push_back(j); visit[j] = 1; } } result.push_back(curGroup); } return result; } };
内容的提问来源于stack exchange,提问作者guru ranjan
相关产品推荐
相关产品推荐

