0

私はC言語の新入生で、これを思いつきました。私はコードします:

    #include <stdio.h>
    main()
    {
       int i=100;
       printf("Helloo is: %d\n", i);  
    }

出力は次のとおりです。Helloo is: 100ここまではすべて素晴らしいです! コードをこれに変更すると

    #include <stdio.h>
    main()
    {
       int i=100;
       printf("Helloo is: %d\n", &i);  // the &i is the change
    }

コンパイルすると、警告が表示されます。warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat].

わかりました、コンパイラのメッセージが表示されますが、好奇心が強いので、とにかくプログラムを実行すると、この出力が得られます。Helloo is: -1078455636プログラムを再度実行すると、別の出力が得られます! そう:

  • これらすべての数字は何ですか? 変数iのメモリアドレス?
  • プログラムを実行するたびに異なる出力が得られるのはなぜですか?

ありがとうございました!

4

3 に答える 3

1

これらすべての数字は何ですか? 変数のメモリアドレスi

これらは、 のアドレスを整数として再解釈する形式ですi。未定義の動作です。整数の代わりにアドレスを渡すことは許可されていません。

プログラムを実行するたびに異なる出力が得られるのはなぜですか?

変数のアドレスは常に変化するため、アドレスを整数として再解釈するコードは常に異なるデータを取得します。

アドレスを正しく出力したい場合は、%pフォーマット指定子を使用し、アドレスを次のようにキャストしますvoid*

printf("Hello is: %p\n", (void*)&i);
于 2013-10-05T12:18:34.347 に答える
1
printf("Helloo is: %d\n", &i);  // the &i is the change  

これは未定義の動作です

正しい書式指定子を指定する必要があります。

アドレスを印刷するには、使用する必要があり%p、標準では %p は void * を使用すると言われているため、キャストしてください。

printf("Helloo is: %p\n", (void *) &i); 
于 2013-10-05T12:23:24.540 に答える
1

&はアドレス取得演算子、&iはへのポインタintです。プログラムを実行するたび&iに変数のアドレスが異なるため、の値が変化します。i

また、ポインターアドレスを出力するには、次のタイプで使用%pします。void *

int i=100;
printf("Helloo is: %d\p\n", (void *)&i);
于 2013-10-05T12:19:48.933 に答える