使用char替代int时出现Runtime check failure #2的原因排查
问题
我编写了一段简单的C语言代码,用于接收ASCII十进制值并返回对应的字符。例如输入65会输出'A',代码如下:
int x; printf("Enter an ASCII number: "); scanf_s("%d", &x); printf("Entered letter is: %c\n", x);
但如果将第一行的int x改为char x,输入65测试程序时会触发Runtime check failure #2,提示变量x周围的堆栈已损坏。我了解该错误通常由内存越界导致,但65处于char的内存范围内,请问这是为什么?
解答
核心问题是格式符与参数类型不匹配,和输入值是否在char范围内无关:
scanf_s的%d格式符要求传入一个int*类型的指针,它会往指针指向的地址写入4字节的int数据(多数系统中int占4字节)。- 当你把变量改成
char x后,&x是char*类型,指向的栈空间只有1字节。scanf_s仍会按%d的规则写入4字节数据,剩下3字节会覆盖x相邻的栈内存,直接破坏堆栈结构,触发Runtime check failure #2。
要解决这个问题,只需把格式符改成匹配char类型的%hhd(对应有符号char)或%hhu(对应无符号char),这样scanf_s只会写入1字节数据,不会越界:
char x; printf("Enter an ASCII number: "); scanf_s("%hhd", &x); printf("Entered letter is: %c\n", x);
内容的提问来源于stack exchange,提问作者Kim Minseo
相关产品推荐
相关产品推荐

