0

Expert C Programmingの 146 ページに、典型的な Unix OSa.outが実行のためにファイルのさまざまなセグメントをさまざまなメモリ セグメントに割り当てる方法を説明する演習があります。

「スターター」コードは次のとおりです。

main () {
   int i;
   printf("The stack top is near %#X\n", &i);
}

%Xwith を使用すると、コンパイラは警告しますが、エラーにはなりません&i

warning: format ‘%X’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat]

メモリ レイアウトと 16 進アドレスの初心者として、推奨される書式設定が目的の情報を完全に表していないのではないかと思っています。あちこち検索しましたが、決定的なものは見つかりませんでした。たとえば、%pフォーマット キューの使用について読みましたが、この場合にそれが必要かどうかは明確ではありませんでした。

また、この神聖な C の本がそのような誤りを犯すとは思えないので、このユース ケースには関係のない警告だと思いますが、確認したいと思います。

4

1 に答える 1

2
   int i;
   printf("The stack top is near %#X\n", &i);

これは未定義の動作です。X変換指定子は 型の引数を必要としますが、unsigned int&iのポインタ型intです。C では、未定義の動作が発生した場合に実装が変換を中止する必要はありませんが、C では翻訳の中止が許可されています。

ポインター値を出力するには、p変換指定子を使用します。

   int i;
   printf("The stack top is near %p\n", (void *) &i);
于 2013-03-04T18:34:11.480 に答える