C语言调用scanf后char变量值被置零的原因咨询
问题原因及解决方案
你的问题本质是内存越界引发的未定义行为,具体原因如下:
类型不匹配导致内存写入溢出
char类型在绝大多数系统中仅占1字节,而int类型通常占4字节。scanf的%d格式符是专门用于读取int类型数据的,它会尝试向传入的地址写入完整的4字节数据。- 你定义的三个
char变量在栈上是连续分配的,当用%d给其中一个char变量赋值时,会一次性写入4字节,直接覆盖该变量相邻的内存区域——这就会修改其他char变量的值。
为什么被覆盖的变量会变成0?
你输入的数值(15、24、40)都是小整数,它们的二进制表示中只有低字节(1字节)有非零值,剩下的3个高位字节都是0。当scanf写入4字节时,覆盖到其他char变量的正好是这些高位的0字节,所以之前赋值的变量会被改成0。
修复方案
有两种简单的修复方式:
方式1:使用正确的格式符读取char类型
对于signed char,使用%hhd格式符(C99及以上标准支持);如果是unsigned char,则用%hhu。修改后的代码如下:
#include <stdio.h> int main(){ char mychar; char mychar2; char mychar3; scanf(" %hhd",&mychar); printf("char1 is :%d \n",mychar); scanf(" %hhd",&mychar2); printf("char1 is :%d\n",mychar); printf("char2 is :%d\n",mychar2); scanf(" %hhd",&mychar3); printf("char1 is :%d\n",mychar); printf("char2 is :%d\n",mychar2); printf("char3 is :%d",mychar3); return 0; }
方式2:将变量类型改为int
如果不需要严格使用char类型,直接把变量定义为int,这样%d格式符就能正确匹配,不会出现内存越界:
#include <stdio.h> int main(){ int mychar; int mychar2; int mychar3; scanf(" %d",&mychar); printf("char1 is :%d \n",mychar); scanf(" %d",&mychar2); printf("char1 is :%d\n",mychar); printf("char2 is :%d\n",mychar2); scanf(" %d",&mychar3); printf("char1 is :%d\n",mychar); printf("char2 is :%d\n",mychar2); printf("char3 is :%d",mychar3); return 0; }
内容的提问来源于stack exchange,提问作者amr mohamed
相关产品推荐
相关产品推荐

