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

C++求解三的幂子集问题大输入触发SIGSEGV错误原因问询

SIGSEGV错误原因分析

直接原因:栈溢出

你代码中使用了C++标准未定义的栈上变长数组(VLA):ll a[n];和ll idx[n] = {0};都是以输入的变量n作为数组长度,这类编译器扩展语法实现的数组默认分配在程序栈空间,而常规程序栈的容量通常只有2~8MB。当输入的n值较大时,两个long long类型数组占用的内存会迅速超过栈容量,触发栈溢出,最终抛出SIGSEGV错误。

根本原因:逻辑设计冗余

这道题的核心规律是:按子集和从小到大排序后的第n个子集,正好对应n的二进制表示中所有为1的位,每一位对应3的对应次幂。比如n=5(二进制101),对应的子集就是$3^0 + 3^2 = 1+9=10$,你根本不需要申请长度为n的数组,最多只需要遍历n的二进制位(最多60位,对应long long的长度),完全不需要大内存空间。你申请长度为n的数组属于完全多余的操作,n稍大就必然触发内存错误。

其他潜在问题

代码中n & (1<<j)里的1是int类型,当j超过31时左移操作会溢出,行为未定义,需要改成1LL << j才能适配long long类型的n。

修复示例片段

while(t--){
    ll n;
    cin >> n;
    vector<ll> res;
    // long long最多63位,遍历到60足够覆盖常规题目输入范围
    for(ll j=0; j<=60; j++){ 
        if(n & (1LL << j)){
            res.push_back(poww(3, j));
        }
    }
    cout << res.size() << endl;
    for(auto num : res){
        cout << num << " ";
    }
    cout << endl;
}

内容的提问来源于stack exchange,提问作者tanya chhabra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:06:03