C语言位计数代码异常:输出随机大数值求助
问题排查:C语言存储二进制位出现随机值的原因与解决
核心问题:数组越界访问导致未初始化内存读取
你的代码存在数组下标越界的严重问题,直接引发了随机值输出:
- 数组
fv的合法下标范围是0~31(定义为int fv[32]),但循环中i=0时,32 - i = 32,这已经超出了数组边界,属于非法内存访问。 - 该错误导致数组前31个元素(
fv[0]到fv[30])从未被赋值,栈上的未初始化内存会保留随机垃圾数据,输出时就会出现非0/1的大数值。
另外还有格式匹配问题:sizeof(5)返回size_t类型,用%ld打印属于格式不匹配,应该用%zu。
修正后的代码
#include <stdio.h> int main() { printf("testing code\n"); int fv[32] = {0}; // 初始化数组为0,避免意外 int fiv = 5; for (int i = 0; i < 32; i++) { // 调整下标为31 - i,对应从最高位到最低位存入数组 if (fiv & 1) fv[31 - i] = 1; else fv[31 - i] = 0; fiv >>= 1; } printf("bit length of 5: %zu\n\n", (sizeof(5) * 8)); printf("five: "); for (int i = 0; i < 32; i++) { printf("%d ", fv[i]); } printf("\n"); return 0; }
运行结果说明
修正后,数组会正确存储5的二进制位(5的二进制为00000000 00000000 00000000 00000101),输出示例:
testing code bit length of 5: 32 five: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
如果想把最低位存在数组第一个位置(fv[0]对应二进制第0位),直接将循环内的下标改为fv[i]即可。
内容的提问来源于stack exchange,提问作者synnøve
相关产品推荐
相关产品推荐

