C++使用vector求解LeetCode数组交集时触发Segmentation Fault
段错误原因分析与修复方案
核心问题
你代码中的arr1和arr2是空的vector容器,没有预先分配内存空间。C++中vector的下标操作[]不会自动扩容,直接用arr1[i]或arr2[i]访问空vector的下标,会触发内存越界,导致Segmentation Fault(段错误)。
两种修复方法
方法1:初始化时指定vector大小
定义vector时直接传入元素个数,预先分配内存:
vector<int> arr1(n), arr2(m);
这样vector会提前创建n个和m个默认值元素,后续的下标访问arr1[i]就合法了。
方法2:使用push_back添加元素
保持vector为空,在循环中读取元素后用push_back追加到vector末尾:
for (int i = 0; i < n; i++){ int num; cin >> num; arr1.push_back(num); } for (int i = 0; i < m; i++){ int num; cin >> num; arr2.push_back(num); }
修正后的完整代码(以方法1为例)
vector<int> solve(){ int n,m; cin >> n >> m; vector<int> arr1(n), arr2(m); for (int i = 0; i < n; i++){ cin >> arr1[i]; } for (int i = 0; i < m; i++){ cin >> arr2[i]; } sort(arr1.begin(), arr1.end()); sort(arr2.begin(), arr2.end()); vector<int> result; int i = 0, j = 0; while (i < n && j < m){ if (arr1[i] == arr2[j]){ result.push_back(arr1[i]); i++; j++; } else if(arr1[i] > arr2[j]){ j++; } else { i++; } } return result; }
内容的提问来源于stack exchange,提问作者Colton Walker
相关产品推荐
相关产品推荐

