编写的十进制转二进制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
相关产品推荐
相关产品推荐

