C++代码运行触发Abort trap: 6错误,请求排查与修复
搞定「Abort trap: 6」错误并优化你的异或二元组统计代码
让我一步步帮你排查问题并修复:
问题根源剖析
1. 数组越界直接触发崩溃
你代码里的arr[4]是固定大小数组,但在遍历二进制位时,只要当前数i的二进制中1的个数超过4(比如n≥5且i是全1的情况),x就会涨到4甚至更大,此时arr[x] = j+1会访问数组边界外的内存——这就是「Abort trap: 6」的直接诱因。而且哪怕最终只需要chk==2的情况,你还是会执行所有二进制位的赋值操作,纯纯做无用功还埋了内存坑。
2. 非标准变长数组暗藏隐患
ll res[t];这种写法是GCC的编译器扩展,并不是C++标准语法。小数据量下可能能跑,但t稍大就容易栈溢出,换个编译器甚至直接编译失败,完全不具备可移植性。
3. 算法效率低到离谱
你现在枚举所有2^n个数,这是指数级增长的复杂度!n=20就有百万次循环,n=30直接十亿次——别说得到结果,光等待运行结束都遥遥无期,完全没必要这么绕远路。
修复后的代码(附优化)
我把所有问题都改掉,同时大幅提升算法效率:
#include <iostream> #include <vector> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ll t; cin >> t; vector<ll> res(t); for (ll k = 0; k < t; ++k) { ll n, cnt = 0; cin >> n; // 直接枚举所有a < b的二元组,对应原逻辑中二进制恰好两个1的情况 for (ll a = 1; a <= n; ++a) { for (ll b = a + 1; b <= n; ++b) { if ((a ^ b) <= n) { ++cnt; } } } res[k] = cnt; } for (ll ans : res) { cout << ans << '\n'; } return 0; }
修复说明
- 彻底解决数组越界:直接枚举
1≤a<b≤n的二元组,完全砍掉了容易出问题的arr数组,逻辑更直白,也彻底消除了内存访问风险。 - 用标准容器替代变长数组:
std::vector<ll>是C++标准容器,安全、可移植,不会出现栈溢出问题。 - 复杂度从O(2^n)降到O(n²):原来的指数级复杂度直接变成多项式复杂度,哪怕
n=1000也能轻松运行。 - 输入输出加速:添加
ios::sync_with_stdio(false); cin.tie(nullptr);,处理大量测试用例时速度会明显提升。
如果你的n会非常大(比如n=1e4),O(n²)可能还是不够,可以再用数位DP进一步优化到O(n log n),但绝大多数常规题目场景下,上面的代码已经完全够用。
内容的提问来源于stack exchange,提问作者Arjun
相关产品推荐
相关产品推荐

