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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:05:29