以下程序的输入是
10 10
10 10
但输出是
0 20
为什么?
/* scanf example */
#include <stdio.h>
int main ()
{
short int a, b, c, d, e, f;
a=b=c=d=e=f=0;
scanf("%d %d",&a,&b);
scanf("%d %d",&e,&d);
c=a+b;
f=d+e;
printf("%d %d\n",c,f);
return 0;
}
答案 0 :(得分:8)
scanf
的正确short int
格式说明符为%hd
,而不是%d
。您遇到了未定义行为的结果。
答案 1 :(得分:3)
你已经取了6个变量a,b,c,d,e,f。它们分配的内存为2个字节,起始内存地址为f 0x0,e 0x2,d 0x4,c 0x6,b 0x8,a 0xa
当你做的时候 scanf(“%d%d”,&amp; a,&amp; b) a的第一个值从内存位置0xa写入,占用4个字节直到0xe。然后从占据4个字节的位置0x8开始写入b的值直到0xc,从而覆盖a的存储位置。与其他scanf相同。如果更改内存位置的顺序,将获得不同的值。
请注意输出取决于您使用的平台因此未定义的行为
答案 2 :(得分:0)
因为堆栈已损坏。 假设“short int”类型在您的平台上占用2个字节,而“int”类型占用4个字节。变量a,b,c,d,e,f在堆栈上分配,每个分配2个字节。每次使用“%d”说明符而不是“%hd”读取值时,告诉scanf()将其记忆为“int”,取4个字节而不是2个。这当然会产生不可预测的结果。 根据我的经验,使用scanf()会带来更多麻烦而不是好处:-)所以你可能想要使用更安全的fread()然后将字符串转换为整数。