2

给以下程序的输入是

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

3 回答 3

8

的正确scanf格式说明符short int%hd,而不是普通%d的。您正在经历未定义行为的结果。

于 2012-07-06T06:18:27.793 回答
3

你取了 6 个变量 a、b、c、d、e、f。它们分配的内存为 2 个字节,起始内存地址为 f 0x0、e 0x2、d 0x4、c 0x6、b 0x8、a 0xa

当您执行 scanf("%d %d",&a,&b) 时,a 的第一个值从内存位置 0xa 写入,占用 4 个字节直到 0xe。然后 b 的值从位置 0x8 开始写入,占用 4 个字节直到 0xc,从而覆盖 a 的内存位置。与其他scanf相同。如果您更改内存位置的顺序,您将获得不同的值。

请注意输出取决于您使用的平台,因此未定义的行为

于 2012-07-06T07:29:35.617 回答
0

因为堆栈被破坏了。假设“short int”类型在您的平台上占用 2 个字节,而“int”类型占用 4 个字节。变量 a、b、c、d、e、f 在堆栈上分配,每个分配 2 个字节。每次使用“%d”说明符而不是“%hd”读取一个值时,您告诉 scanf() 将其存储为“int”,占用 4 个字节而不是 2 个字节。当然,这会产生不可预知的结果. 根据我的经验,使用 scanf() 带来的麻烦多于好处 :-),因此您可能希望使用更安全的 fread(),然后将字符串转换为整数。

于 2012-07-06T09:20:02.223 回答