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、plain ではなくis%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、a0xaのようになります。

scanf( "%d%d"、&a、&b)を実行している場合、aの最初の値はメモリ位置0xaから書き込まれ、0xeまで4バイトを占有します。次に、bの値が4バイトを占める0x8の位置から0xcまで書き込まれるため、aのメモリ位置が上書きされます。他のscanfと同じです。メモリの場所の順序を変更すると、異なる値が得られます。

出力は使用しているプラ​​ットフォームに依存するため、未定義の動作に注意してください

于 2012-07-06T07:29:35.617 に答える
0

スタックが破損するためです。プラットフォームで「short int」型が 2 バイト、「int」型が 4 バイトであるとします。変数 a、b、c、d、e、f はスタックに割り当てられ、それぞれ 2 バイトが割り当てられます。「%hd」の代わりに「%d」指定子を使用して値を読み取るたびに、scanf() に「int」として記憶するように指示し、2 バイトではなく 4 バイトを取ります。もちろん、予測できない結果が生じます。 . 私の経験では、scanf() の使用は利点よりも頭痛の種になります :-) より安全な fread() を使用してから、文字列を整数に変換することをお勧めします。

于 2012-07-06T09:20:02.223 に答える