• ベストアンサー

C言語に関して

#include <stdio.h> #define NMAX 5 typedef union mixeddata { char status; double data; }MIXD; typedef struct expdata { int flag; MIXD result; ←ここ }EXPD; main() : : : 上のソースの「ここ」と書いてある場所の、result のバイト数はいくつか? と聞かれたのですが、何バイトでしょうか?  回答宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

>何バイトでしょうか? 「処理系に依存するので不定」または「sizeof(result)バイト」が解答になります。 charとdoubleの変数をメモリに配置した場合、charとdoubleの間に「doubleの変数が、doubleのサイズ境界に整列するよう、隙間を空ける環境」では、隙間が空きます。 そういう事を考慮しない処理系では、隙間は空きません。 こういう質問の答えで、確実に正解と言えるのは「処理系に依存するので不定」または「sizeof(result)バイト」と言う解答だけです。 当方が知るだけでも、答えが「3」になる処理系と「4」になる処理系と「5」になる処理系と「6」になる処理系と「8」になる処理系の、5種類があります。 「3」と答えても「4」と答えても「5」と答えても「6」と答えても「8」と答えても不正解です。 「3または4または5または6または8」と答えても不正解です。 なんでこんな事が起きるかって言うと「2バイトサイズ、または、4バイトサイズでメモリアクセスする場合は、必ず、偶数アドレスじゃないといけない」と言うCPUが存在するからです。 そういうCPUでは「doubleの変数を奇数アドレスのメモリに置くと、アクセスした瞬間に、アドレス違反で例外が発生して実行中断してしまう」のです。 正しく実行するには「doubleの変数を偶数アドレスに置く」とか「doubleの変数を4の倍数のアドレスに置く」とかしないといけません。 すると「charとdoubleの間に、アドレス調整の為の隙間が必要」になって来ます。 ごちゃごちゃ説明するよりも、以下のページを読んでもらった方が話が早いかな。 http://www.g-ishihara.com/c_st_01.htm

pairot
質問者

お礼

回答ありがとうございました。 とてもわかりやすかったです。 回答してくださった他の皆様もありがとうございました。

その他の回答 (5)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.6

>問題ミスですか? 何バイトであるかは一意に決まるはずですので、 問題のミスではないと思います。 MIXDは共用体なので、大きい方のサイズを 採用するのではないでしょうか。

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.4

教科書に載っているでしょ?charは1バイト(8ビット)、doubleは8バイト(64ビット)

pairot
質問者

補足

いや、charが1バイト、doubleが8バイトな事は知っています。 テストで resultは何バイトですか? と聞かれたのです。 答えは1つなので、1バイトか8バイトかどっちなのだろう?と疑問に思いました。 問題ミスですか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

おっと, その形だと「sizeof result」は不可なんだった. sizeof(MIXD) バイト, で.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

sizeof result バイト.

pairot
質問者

補足

8バイトですか?

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

resultはMIXDタイプ。MIXDはcharとdoubleですよね。 charは何バイトかな?doubleは何バイトかな?

pairot
質問者

補足

8バイトか1バイトかで迷ったのですが、どっちでもいいんですか?