scanf重置常量变量求助:C语言位运算代码异常排查
解决scanf写入导致const变量被意外覆盖的问题
问题根源
你遇到的问题是scanf格式符与变量类型不匹配引发的内存越界写入:
%u是读取unsigned int类型的格式说明符,要求传入unsigned int*类型指针,但你传入的是unsigned char*(&temp2的类型)。- 假设系统中
unsigned int占4字节、unsigned char占1字节,执行scanf("%u", &temp2);时,scanf会往temp2地址写入4字节数据,超出temp2的1字节空间后,剩余3字节会覆盖栈上相邻的内存区域——刚好就是idade变量的存储位置,最终导致这个const变量的值被意外修改为0。
两种修复方案
方案1:用临时int变量中转输入
先通过unsigned int接收输入,再强制转换赋值给temp2,避免直接越界:
printf("Digite um numero entre 0 e 255: "); unsigned int input_val; scanf("%u", &input_val); temp2 = (unsigned char)input_val; // 截断到unsigned char的有效范围
方案2:使用匹配的格式说明符
C99及以后标准支持%hhu格式符,专门用于读取unsigned char类型,直接修改scanf语句即可:
scanf("%hhu", &temp2);
额外提示
- 尽管
idade被声明为const,但这只是编译器层面的只读约束,栈上的const变量内存并非物理只读,越界写入依然能修改它的值,这种行为属于C语言中的未定义行为,完全依赖编译器的内存布局。 - 建议添加输入范围检查,确保用户输入的数值在0-255之间,避免转换后的值溢出:
if (input_val > 255) { printf("Valor invalido! Digite um numero entre 0 e 255.\n"); // 可在此处处理错误,比如引导用户重新输入 } else { temp2 = (unsigned char)input_val; }
内容的提问来源于stack exchange,提问作者user19919865
相关产品推荐
相关产品推荐

