返回二维vector时触发Segmentation Fault(段错误)问题排查求助
解决你的Segmentation Fault问题
我来帮你分析这段代码里导致段错误的原因,以及对应的修复方案:
问题根源
你的段错误大概率是vector越界访问导致的:
- 你在
getting_schedule里预先创建了一个大小为480的二维vector,但如果输入的条目数量超过480(哪怕你主观认为不会),num_of_schedule会递增到480,这时候访问schedule[480][0]就会越界写入内存——这会破坏vector的内部控制结构(比如容量、大小的管理数据),最终在return语句拷贝vector时触发段错误。 - 另外,即使输入没超480,你返回的vector里会包含大量未使用的默认初始化元素(
{0,0}),这也不是高效的做法。
修复方案:动态构建vector
最安全的方式是用push_back动态添加元素,让vector自动管理容量,彻底避免越界问题。修改后的代码如下:
#include <vector> #include <iostream> using namespace std; vector<vector<int>> getting_schedule(int &num_of_schedule) { vector<vector<int>> schedule; int duration; int period_ID; num_of_schedule = 0; // 重置计数,避免传入的初始值干扰 while (cin >> duration >> period_ID) { // 直接添加新的条目 schedule.push_back({duration, period_ID - 1}); num_of_schedule++; } return schedule; } int main() { vector<vector<int>> input_schedule; int num_of_schedules = 0; input_schedule = getting_schedule(num_of_schedules); // 现在input_schedule的大小就是实际读取的条目数,没有冗余元素 return 0; }
如果你坚持预先分配大小
如果你一定要固定vector的初始大小,那必须在循环里添加越界检查,确保不会访问超出vector范围的元素:
#include <vector> #include <iostream> using namespace std; vector<vector<int>> getting_schedule(int &num_of_schedule) { const int MAX_SCHEDULE = 480; vector<vector<int>> schedule(MAX_SCHEDULE, vector<int>(2)); int duration; int period_ID; num_of_schedule = 0; // 添加检查,确保不越界 while (cin >> duration >> period_ID && num_of_schedule < MAX_SCHEDULE) { schedule[num_of_schedule][0] = duration; schedule[num_of_schedule][1] = period_ID - 1; num_of_schedule++; } // 可选:截断vector到实际使用的大小,避免返回冗余元素 schedule.resize(num_of_schedule); return schedule; } int main() { vector<vector<int>> input_schedule(480, vector<int>(2)); int num_of_schedules = 0; input_schedule = getting_schedule(num_of_schedules); return 0; }
这样就能保证永远不会越界访问vector,自然也就不会触发段错误了。
内容的提问来源于stack exchange,提问作者mmd nm
相关产品推荐
相关产品推荐

