C语言以%d的方式scanf char类型的变量

说明:所有测试均在Win10+VS2017的环境下进行。
首先看下面这一段代码:

#include 
int main()
{
	char a;
	scanf("%d", &a);
}

刚开始我以为这段代码是没问题的,就是输入变量a的ASSIC码进行赋值,但运行之后发现会给出异常提示:Run-Time Check Failure #2 - Stack around the variable ‘a’ was corrupted.
C语言以%d的方式scanf char类型的变量_第1张图片

看提示信息,说是变量a的栈被破坏了。看来C语言不允许这种操作,不过针对此问题有两个解决方法,一种是将a改为全局变量,另一种方法是将%d改为%hhd。

#include 
char a;
int main()
{
	scanf("%d", &a);
}
#include 
int main()
{
	char a;
	scanf("%hhd", &a);
}

问题虽然解决了,但我还是想知道为什么C语言不允许用输入ASSIC码的方式对char类型的变量进行赋值(在代码中对char类型变量用ASSIC码赋值是允许的)。
于是我写了下面这段程序

#include 
int main()
{
	char c[4];
	scanf("%d", &c[0]);
	printf("%c %c %c %c",c[0], c[1], c[2], c[3]);
}

我输入的是825307441,它对应的二进制为0011 0001 0011 0001 0011 0001 0011 0001,对应的十六进制为31 31 31 31H,程序输出了四个1
在这里插入图片描述
字符’1’的ASSIC码正好是31H,因此,虽然我们只想对a[0]进行赋值,但如果不小心把ASSIC码输的太大,是会破坏其余的存储空间的。

你可能感兴趣的:(C语言以%d的方式scanf char类型的变量)