You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:03:25