- ベストアンサー
すごく困っています;;
下記のプログラムの組み方が、手元の参考書をいくら読んでも分かりません・・・。 とても困っておりますので、どなたかご教授いただけないでしょうか? char a; char b[o]; short c; int d; float e; double f; 上記の各変数(配列の場合は各要素)のアドレスを16進数で表示しなさい。 また変数(配列の場合は配列全体)のサイズを10進数で表示しなさい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
勉強なのにすべてを教えても意味がないのでヒントを。 x86系でコンパイラはgccを使っているものとします。 ・アドレスを16進数 アドレスは、printf()関数の%pで表示できます。 変数からアドレスを得る方法は、参考書のポインタ関係の説明を読んでいれば出てきます。 ・サイズを10進数 サイズは、printf()関数の%dで表示できます。 変数からサイズを得るには、変数サイズを求める専用演算子がありますので参考書を読んでみてください。
その他の回答 (4)
- aris-wiz
- ベストアンサー率38% (96/252)
>もう少し簡単にご教授 あなたが何を理解して、何を理解していないのかは、 回答をする人にとって全く知ることのできない事です。 >参考書をいくら読んでも分かりません・・・。 とありますが、いったいその参考書の 何がどう分からなかったのでしょうか? この手の質問で一番多いタイプですが、 皆が同じOSをつかって、同じコンパイラを使っているわけでは ありません。学校でどのOSを使っているか、どのコンパイラをつかって いるのかくらいの情報を載せて下さい。 これを載せれば、環境依存云々の紛らわしい話が出てこなくなります。 #すべての環境に対応させなくて良いわけですから。 参考URLにも同じ質問で回答が出ているので、 一応張っておきます。
- jacta
- ベストアンサー率26% (845/3158)
#2の回答を見て、 > また変数(配列の場合は配列全体)のサイズを10進数で表示しなさい。 も、入門書や教科書を見ただけでは正しい回答を導けないことに気付きました。仕方がないので、この部分だけ、そのものズバリに近い回答を書きます。 まず、表示の方法ですが、これも処理系に依存するので正確なことは分からないのですが、標準出力に出力すれば表示できるものと仮定して話を進めます。 変数のバイト単位でのサイズはsizeof演算子で取得することができます。バイト単位でない場合は、どうしたいのかを補足してください。 次に、取得した値をprintf関数を使って標準出力に出力します。 このときに注意しなければならないのは、sizeof演算子の評価結果の型はsize_t型だということです。 処理系がC99に対応しているのであれば、 printf("%zu\n", sizeof a); のようにすれば、期待通りの結果になるはずです。 そうでない場合、次のようにすることで、ほとんどの処理系で期待通りの結果になるはずです。 printf("%lu\n", (unsigned long)sizeof a); ここで、もし単に printf("%u\n", sizeof a); または printf("%d\n", sizeof a); とした場合、size_t型とint型のサイズが同じであるかどうかは処理系に依存しますので、同じならまず問題ありませんが、そうでなければ動作が未定義になります。 「まず」問題ないと書いたのは、 char b[o]; における o の値が分からないためです。つまり、%d を指定したときに、sizeof b[o] が INT_MAX を超えていると誤動作するからです。 たぶん、難しすぎると思いますが、それだけこの問題は難しいのです。
- jacta
- ベストアンサー率26% (845/3158)
> もう少し簡単にご教授いただけるわけにはいきませんでしょうか? 教授することはできませんが、もう少し素人向けに... > 上記の各変数(配列の場合は各要素)のアドレスを16進数で表示しなさい。 無理。 ただし、使っているコンパイラやライブラリを特定するなら、場合によっては可能。 > また変数(配列の場合は配列全体)のサイズを10進数で表示しなさい。 入門書か教科書を読め。 > しかし、学校の課題ですので、答えがないというのは考えにくいのですが、、 先生を過信しないことです。 ただ、質問内容に書いていない(質問者さんの学校でしか通用しない)暗黙知があるとしたら、その前提の元に答えが導ける可能性はあります。
- jacta
- ベストアンサー率26% (845/3158)
> 上記の各変数(配列の場合は各要素)のアドレスを16進数で表示しなさい。 これは一般的な方法がありません。 printf系関数の%p(デフォルトのstd::num_put::do_putも同様)の変換方法は処理系定義だからです。また、ポインタを整数型にキャストした場合の動作も処理系定義なので、整数型に変換してから16進数に直しても、期待通りになるかどうかは環境に依存します。 > また変数(配列の場合は配列全体)のサイズを10進数で表示しなさい。 これは簡単ですので、ヒントも出しません。 > 手元の参考書をいくら読んでも分かりません・・・。 何回ぐらい読んだのでしょうか? 1回読んで分からないのであれば、大きな声を出して(←が重要です)5回でも10回でも読んでみましょう。 分からないのがアドレスの方なら致し方ありません。
お礼
早速のご返信誠にありがとうございます。 しかし、学校の課題ですので、答えがないというのは考えにくいのですが、、 それに、私問題の意味もイマイチわかっておらず、jacta様の回答は私には難しすぎて意味が分かりませんでした。 もう少し簡単にご教授いただけるわけにはいきませんでしょうか?