【发布时间】:2015-09-15 18:40:32
【问题描述】:
这是一个用于交换字节的半字节的程序,非常适合字节,但我遇到了一个问题。
代码:
#include<stdio.h>
void main()
{
unsigned char a = 0;
scanf("%d", &a);
a = ((a << 4) | (a >> 4));
printf("the value of a is %d\n\r", a);
}
您可以在scanf 声明中看到我收到的是%d,而不是收到%c 的char。上面的代码完美运行。但是如果我用%c 替换%d,我会得到一个不同的不想要的答案
为什么?
【问题讨论】:
-
因为使用错误的格式说明符会导致未定义的行为。
-
使用
scanf("%d", &a),您正在将sizeof(int)字节复制到变量a的内存地址中。但是由于sizeof(a) == 1 < sizeof(int),此操作会产生内存覆盖,此时您的程序的行为是未定义的(即,任何事情都可能发生)。
标签: c char scanf unsigned-char format-specifiers