C++打印所有等和子序列代码触发Segmentation fault问题排查
问题现象
编写用于打印所有和等于目标值的子序列的C++代码时,运行触发异常:在线编译器环境报Segmentation fault段错误,VSCode环境运行无任何输出。
原代码如下:
#include<bits/stdc++.h> using namespace std; void solve(int ind,vector<int>&ar,int sum,int target,int nums[],int n) { //cout<<sum<<" "; if(ind == n) { if(sum == target) { cout<<2<<endl; for(auto it:ar) { cout<<it<<" "; } return ; } } ar.push_back(nums[ind]); sum+=nums[ind]; solve(ind+1,ar,sum,target,nums,n); sum-=nums[ind]; ar.pop_back(); solve(ind+1,ar,sum,target,nums,n); } int main() { int nums[] = {1,2,1}; int target = 2; int n = 3; vector<int>ar; int sum = 0; solve(0,ar,0,target,nums,n); }
运行报错回溯信息:
/bin/bash: line 1: 18 Segmentation fault timeout 15s ./f9f11492-657e-4e6a-b05c-ffc40f6540ea < f9f11492-657e-4e6a-b05c-ffc40f6540ea.in
故障根源
段错误由递归终止逻辑缺失导致,具体触发流程:
- 递归的终止判断为
ind == n(即已经遍历完所有数组元素),但代码仅在sum == target的匹配分支中写了return,如果遍历完元素后sum不等于目标值,代码不会终止当前递归分支,会继续向下执行元素选取逻辑 - 此时
ind的值已经等于数组长度n,执行ar.push_back(nums[ind])时会访问nums[n],而数组合法下标范围为0~n-1,属于非法越界访问内存 - 越界后递归调用会持续传入更大的ind值,不断非法访问内存区域,同时递归深度无限制增长导致栈溢出,最终触发段错误;由于逻辑始终无法正常走到输出分支,本地VSCode环境运行时也看不到任何输出。
修复方案
只需要补全递归终止分支的返回逻辑即可:当ind == n时,无论sum是否匹配目标值,处理完对应判断后都要执行return,终止当前递归分支,避免越界访问。
注:原代码中匹配成功时输出的cout<<2<<endl;为调试残留,可根据需求自行删除或调整。
修复后的完整可运行代码:
#include<bits/stdc++.h> using namespace std; void solve(int ind,vector<int>&ar,int sum,int target,int nums[],int n) { if(ind == n) { if(sum == target) { for(auto it:ar) { cout<<it<<" "; } cout<<endl; } // 补全return,终止当前递归分支 return; } // 选择当前元素进入子序列 ar.push_back(nums[ind]); sum+=nums[ind]; solve(ind+1,ar,sum,target,nums,n); // 不选当前元素,状态回溯 sum-=nums[ind]; ar.pop_back(); solve(ind+1,ar,sum,target,nums,n); } int main() { int nums[] = {1,2,1}; int target = 2; int n = 3; vector<int>ar; solve(0,ar,0,target,nums,n); return 0; }
修复后运行输出为:
2 1 1
符合预期(和为2的子序列分别是[2]、[1,1])。
内容的提问来源于stack exchange,提问作者Avinash Anand
相关产品推荐
相关产品推荐

