- ベストアンサー
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 のバイト数はいくつか? と聞かれたのですが、何バイトでしょうか? 回答宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>何バイトでしょうか? 「処理系に依存するので不定」または「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
その他の回答 (5)
- asuncion
- ベストアンサー率33% (2127/6289)
>問題ミスですか? 何バイトであるかは一意に決まるはずですので、 問題のミスではないと思います。 MIXDは共用体なので、大きい方のサイズを 採用するのではないでしょうか。
- maiko0318
- ベストアンサー率21% (1483/6969)
教科書に載っているでしょ?charは1バイト(8ビット)、doubleは8バイト(64ビット)
補足
いや、charが1バイト、doubleが8バイトな事は知っています。 テストで resultは何バイトですか? と聞かれたのです。 答えは1つなので、1バイトか8バイトかどっちなのだろう?と疑問に思いました。 問題ミスですか?
- Tacosan
- ベストアンサー率23% (3656/15482)
おっと, その形だと「sizeof result」は不可なんだった. sizeof(MIXD) バイト, で.
- Tacosan
- ベストアンサー率23% (3656/15482)
sizeof result バイト.
補足
8バイトですか?
- maiko0318
- ベストアンサー率21% (1483/6969)
resultはMIXDタイプ。MIXDはcharとdoubleですよね。 charは何バイトかな?doubleは何バイトかな?
補足
8バイトか1バイトかで迷ったのですが、どっちでもいいんですか?
お礼
回答ありがとうございました。 とてもわかりやすかったです。 回答してくださった他の皆様もありがとうございました。