C语言中char变量配合%d格式符做scanf输入出现栈损坏运行时错误
问题原因与解决方案
你编写的代码如下:
int main() { char ch = 0; int c = 0; scanf("%d", &ch); printf("%c", ch); }
问题产生原因
ch是char类型,通常在编译环境中仅占1字节内存空间。scanf的%d格式符要求传入的参数是int*类型,int类型通常占4字节内存。你给%d传入了char*类型的地址,scanf会默认该地址指向4字节的可用空间,写入输入数值时会覆盖ch地址后续的3字节栈内存,导致栈结构被破坏。- Visual Studio默认开启的运行时栈检查机制会在函数退出时检测栈完整性,发现栈被破坏就会抛出你看到的报错。你输入小数值时
ch所在的1字节数据是正确的,所以可以正常输出字符,但越界写入的操作已经发生,最终还是会触发崩溃。
解决方案
有两种常用的修复方式:
方案1:修改格式符匹配变量类型
将scanf的%d替换为%hhd,该格式符专门对应1字节长度的有符号整型(即char类型),只会写入1字节数据,不会产生越界:
scanf("%hhd", &ch);
如果你的ch是无符号char类型,可以用%hhu作为格式符。
方案2:通过int变量中转输入
先将数值输入到大小匹配%d的int类型变量中,再赋值给ch,避免直接写入char地址产生越界:
int main() { char ch = 0; int input_val = 0; scanf("%d", &input_val); ch = (char)input_val; printf("%c", ch); }
内容的提问来源于stack exchange,提问作者KnFantasy
相关产品推荐
相关产品推荐

