You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:21:21