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

编写的十进制转二进制C函数编译正常但触发zsh段错误,求修正方案

十进制转二进制C代码的段错误修复方案

你的代码出现段错误主要有三个核心问题,对应修改如下:

1. 循环终止条件完全错误

代码里的if (n == 0)是判断指针是否为空,而非输入的数值是否为0。调用DectoBin时传的是&num(有效指针),这个条件永远不会成立,循环会无限执行,导致position不断增大,数组下标越界访问,触发段错误。
修改:把条件改成if (*n == 0),判断指针指向的数值是否为0。

2. 局部数组导致野指针访问

DectoBin里的binary是局部自动数组,函数执行完毕后,这块内存会被系统回收。全局指针p指向这块已释放的内存,主函数里访问p[i]属于非法内存访问,必然触发段错误。
修改:把binary数组改为全局变量,或者在主函数中定义数组并传递给DectoBin(更推荐后者,减少全局变量依赖)。

3. 未显式重置position(可选但必要)

虽然全局变量position默认初始化为0,但如果多次调用DectoBin,position会累计之前的数值,导致数组下标错误。所以每次调用前最好显式把position重置为0。

修改后的完整代码(无全局变量版本,更规范)

#include <stdio.h>

void DectoBin(int n, int *binary, int *position);

int main()
{    
   int num;
   int binary[20] = {0};
   int position = 0;
   printf("Input number : ");
   scanf("%d", &num);
   DectoBin(num, binary, &position);

   // 处理输入为0的情况,确保输出0
   if (position == 0) {
       printf("0");
   } else {
       for (int i = position - 1; i >= 0; i--)
       {
           printf("%d", binary[i]);
       }
   }
}

void DectoBin(int n, int *binary, int *position)
{
    while (n != 0)
    {
        binary[(*position)++] = n % 2;
        n = n / 2;
    }
    return;
}

这个版本去掉了全局变量,避免了野指针问题,同时修复了输入0时无输出的bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:06:46