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
相关产品推荐
相关产品推荐

