- 締切済み
次のプログラムの作り方が分かりません…
整数変数(データ変数)a,b,cを定義し、それぞれ10,20,30を代入しなさい。 次にその変数の格納されているアドレスを表示するプログラム ---------------------------------------------------------- 【ヒント】16進数で打ち出すためには、%xを利用する。課題のように頭に0xを付けるときには、0x%xとすればよい 宜しくお願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
> あと #7 については「uintptr_t を提供しない処理系」で困りませんか? だから結局 uintmax_t を使わざるを得ないのではないかと. はい。そうなんですが、uintptr_tが提供されていない処理系であれば、uintmax_tを使ってもポインタの値を保持できません。 その意味ではC99でも規格厳密合致プログラムは難しいですね。
- Tacosan
- ベストアンサー率23% (3656/15482)
おお, たしかに %#x だと 0 のときに困る>#5. あと #7 については「uintptr_t を提供しない処理系」で困りませんか? だから結局 uintmax_t を使わざるを得ないのではないかと.
- jacta
- ベストアンサー率26% (845/3158)
#5です。 あまり難しくなるといけないので、前回はuintmax_tにしましたが、本当なら、 printf("0x%" PRIxPTR, (uintptr_t)&a); とするのが一番よいのでしょうね。 C99に対応していない古い処理系で、かつ規格厳密合致プログラムを書くのは無理かと思います。 union ptr_bytes { const volatile void *ptr; unsigned char bytes[sizeof(const volatile void*)]; }; のような共用体を作って、ビットパターンを読み取るしかありませんが、この場合のバイトオーダーを特定する一般的な手段がありません。 バイトオーダーはリトルエンディアンとビッグエンディアンだけではありませんし、整数型を使ってバイトオーダーを調べても、それがポインタにもあてはまるという保証はありませんから。 バイトオーダーは無視して、各アドレスに対応するユニークな値が取れればよいのであれば、bytesの要素を前から順に出力すればよいと思います。
- php504
- ベストアンサー率42% (926/2160)
p 実引数は、void へのポインタでなければならない。そのポインタの値を処理系定義の方法で表示文字の並びに変換する。 処理系定義の方法であって16進数と規格で決まっているわけではないのですね。 勉強になりました。
- jacta
- ベストアンサー率26% (845/3158)
常に16進法で表現しなければならないのであれば、例えポインタの値を変換する場合であっても%pは適切ではありませんね。 また、%#xとした場合、値が0のときは0x0とはならず、0と出力されますので、0x%xでなければなりません。 ただし、0x%xではポインタの値を完全に表現できるかどうかわかりませんので、実際には、 printf("0x%jx", (uintmax_t)&a); のようにする必要があります。
- php504
- ベストアンサー率42% (926/2160)
アドレス表示なら %p のほうが適当だと思う
- Tacosan
- ベストアンサー率23% (3656/15482)
これってよく考えると実はいたるところに落とし穴が隠れてるような気がするなぁ. もっとも, 出題者自身は落とし穴に気付いていないと思う. でも, 「16進で出力するときに頭に 0x を付ける」ならそんなことしなくても # フラグをつければいいんじゃない?