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

C++十进制转二进制程序运行报Segmentation fault错误是什么原因

核心错误原因

  • 第一个致命问题:convertToBinary函数内定义的int ans[10000]是栈上的局部数组,函数执行结束后栈空间会被系统自动回收,你返回的ans指针是野指针,后续在send_number里访问这个野指针指向的内存,直接触发段错误。
  • 第二个逻辑错误:二进制转换应该取模2得到当前位的值,你的代码存的是n / 2的商,就算没有段错误也得不到正确的二进制结果。
  • 第三个实现问题:每层递归都会创建独立的ans数组,递归调用的结果没有传递,就算数组内存有效也拿不到完整的16位二进制值。

修复方案

给你两种可行的修改方式,考虑到你是初学者,推荐第一种更简单的非递归写法,不容易出错:

方案1:非递归实现(推荐)

// 因为num最大是65535,正好16位,用静态数组存结果生命周期和程序一致,不会有野指针问题
const int* convertToBinary(unsigned int n) {
    static int ans[16] = {0};
    // 每次调用先清空数组
    for(int k=0;k<16;k++) ans[k] = 0;
    int i = 15; // 从最低位开始存,输出时正好从高位到低位排列
    while(n > 0 && i >=0) {
        ans[i] = n % 2;
        n = n / 2;
        i--;
    }
    return ans;
}

void send_number(int num) {
    const int* bin = convertToBinary(num);
    for (int j = 0; j < 16; j++) {
        printf("%d", bin[j]);
    }   
}

方案2:递归实现(保留递归逻辑的写法)

把数组作为参数传入递归函数,避免每层创建独立数组,同时规避返回局部栈指针的问题:

// 传入预先分配好的数组,递归填充二进制位
void convertToBinary(int i, unsigned int n, int* ans) {
    if (n == 0 || i >=16) return;
    ans[15 - i] = n % 2;
    convertToBinary(i+1, n/2, ans);
}

void send_number(int num) {
    int ans[16] = {0}; // 数组定义在send_number里,生命周期覆盖整个函数执行过程
    convertToBinary(0, num, ans);
    for (int j = 0; j < 16; j++) {
        printf("%d", ans[j]);
    }   
}

额外注意点

  • C++中绝对不要返回局部栈变量的指针或引用,这是新手最容易踩的坑之一,如果需要返回数组,要么用静态数组(注意多线程场景下的线程安全问题),要么用动态分配内存,要么把数组作为参数传入函数填充。
  • 你的num范围是0~65535,刚好是16位无符号整数的范围,不需要开10000这么大的数组,16位空间就足够使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:36:04