Short int不接受该值

时间:2012-07-06 06:16:33

标签: c compiler-construction

以下程序的输入是

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;
}

3 个答案:

答案 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()然后将字符串转换为整数。