C语言数组元素赋值异常:十进制转二进制数组出现随机值(初学者求助)
问题描述
用户提供的代码如下:
#include <cs50.h> #include <stdio.h> #include <string.h> int main(void) { int n = get_int("input number: "); int array[8]; int counter = 0; for (int i = 0; i < 8; i++) { if ((n / 2) != 0) { array[counter] = n % 2; } else if ((n / 2) == 0) { array[counter] = 0; } counter++; n = n / 2; printf("%i ", array[counter]); } printf("\n"); }
用户遇到的问题:
编写上述代码的目的是将输入的十进制数转换为二进制数并存入数组中。目前遇到的问题是数组中出现随机值:第一次循环正常,但当counter=1时,数组元素被赋予随机值(已通过调试器确认)。
输入
4测试时,array[1]、array[2]等元素均为随机值,推测可能读取了其他内存区域的数据?请问是什么原因导致该问题?
问题原因与修复
核心问题1:提前访问未初始化的数组元素
循环中你先给array[counter]赋值,紧接着执行counter++,然后直接打印array[counter]——此时counter已经递增,对应的数组位置还没有被赋值,内存里是随机的垃圾值。比如第一次循环:
- 初始
counter=0,给array[0]赋值 counter变成1,打印array[1],但这个位置从未被初始化,自然输出随机值
核心问题2:二进制转换逻辑错误
你的判断条件(n/2) !=0完全错误,比如当n=1时,n/2=0,但此时n%2=1,这是二进制的最低位,应该存入数组,而不是赋值0。正确的二进制位获取逻辑是直接取n%2,不需要判断n/2的结果。
修复后的基础版本代码
#include <cs50.h> #include <stdio.h> #include <string.h> int main(void) { int n = get_int("input number: "); int array[8]; int counter = 0; for (int i = 0; i < 8; i++) { // 直接获取当前n的二进制最低位 array[counter] = n % 2; // 先打印刚赋值的元素,再更新counter和n printf("%i ", array[counter]); counter++; n = n / 2; } printf("\n"); }
进阶优化:输出高位在前的二进制
如果需要得到符合阅读习惯的高位在前的8位二进制,可以先把所有位存入数组,再正向打印:
#include <cs50.h> #include <stdio.h> int main(void) { int n = get_int("input number: "); int array[8] = {0}; // 初始化数组为0,避免未赋值位的随机值 int counter = 7; // 从数组末尾开始存,对应二进制高位 while (n > 0 && counter >= 0) { array[counter] = n % 2; n = n / 2; counter--; } // 打印完整8位二进制 for (int i = 0; i < 8; i++) { printf("%i", array[i]); } printf("\n"); }
内容的提问来源于stack exchange,提问作者VidR
相关产品推荐
相关产品推荐

