アプリ版:「スタンプのみでお礼する」機能のリリースについて

#include <stdio.h>
#define NMAX 5

typedef union mixeddata
{

char status;
double data;
}MIXD;
typedef struct expdata
{
int flag;
MIXD result; ←ここ
}EXPD;

main()
:
:
:
上のソースの「ここ」と書いてある場所の、result のバイト数はいくつか? と聞かれたのですが、何バイトでしょうか?
 回答宜しくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

とてもわかりやすかったです。

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

お礼日時:2013/07/25 14:24

>問題ミスですか?



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

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

この回答への補足

いや、charが1バイト、doubleが8バイトな事は知っています。

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

問題ミスですか?

補足日時:2013/07/25 14:10
    • good
    • 0

おっと, その形だと「sizeof result」は不可なんだった.



sizeof(MIXD) バイト, で.
    • good
    • 0

sizeof result バイト.

この回答への補足

8バイトですか?

補足日時:2013/07/25 14:00
    • good
    • 0

resultはMIXDタイプ。

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

この回答への補足

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

補足日時:2013/07/25 13:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!