-12
#include<stdio.h>
int main(){
int a;
printf("%u\n ",&a); 
printf("%p\n ",a); 
printf("%p\n ",&a); 
printf("%fp\n ",&a); 
return 0;
}

このコードを試しましたが、出力を理解できません

4193177020
 (nil)
 0x7ffff9eecdbc
 0.000000p

これでセグメント化されたメモリアドレスとは何ですか?オフセットはどの部分ですか?

4

2 に答える 2

5

どうやらあなたのa変数はで初期化されまし0た。

  • %u符号なし整数を表示し、メモリアドレスを引数として渡します
  • %p通常はポインターの値を表示するため、0 の場合は次のように表示されます。(nil)
  • %pa同じことを行いますが、16 進数で表示されるのアドレスを渡すようになりました。
  • %fpis %f(float フォーマット) とリテラルpです。printf は float を期待し、整数を渡すため (ポインターは long/integer 値です)、これが未定義の動作を引き起こすと確信しています。

そこから何を学べるでしょうか。意味のないコードを記述したり、printf スタイルの関数に引数を渡したりしないでください。ただし、それらの引数を正確に予期するフォーマット文字列がない限りは

于 2014-01-26T09:52:34.630 に答える