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

sizeofのデータサイズがどういう風に計算されているのかよく分かりません。
例えば以下のコードですが、

union Name
{
char firstName[10];
char lastName[10];
};

int main()
{
union Name name;
strcpy(name.firstName, "Dennis");
strcpy(name.lastName, "Ritchie");
printf("%d", sizeof(name));
}

outputは11となります。これはなぜでしょうか?
宜しくお願い致します。

A 回答 (5件)

これはunionが分からないのではないでしょうか?


unionは同じ場所を名前や型を代えて宣言する方法ですよね?
name.firstName.[0]もname.lastName.[0]も全く同じ場所のデータですよ。
一番大きなサイズが取られますが先頭は同じ場所です。

例えば
union Person
{
char cFirstName[10];
char cLastName[10];
char cAddress[255];
}
で終端コードまで計算するコンパイラならsizeof(Person)は256です。
通常は255です。
cFirstName[0]を'A'に変えたら、cLastName[0]もcAddress[0]も'A'に変わります。
Unionですから。
structを使えば、期待するサイズが得られるのではないでしょうか?
    • good
    • 0
この回答へのお礼

sizeofが分からないと思っていましたが、unionが分かっていないのではと気付いて解説して下さったTreatMeGentlyさんをベストアンサーにしたいと思います。ありがとうございました!

お礼日時:2014/07/04 13:45

unionで宣言すると共用体になるので10ですね。



structの構造体宣言なら20になります。

プログラムからするとstructの間違いでは?

http://www.comb.kokushikan.ac.jp/~ken/blogn/sb/c …
    • good
    • 0

「よくわかりません」ということだけど, どこまでわかってどこで困っているのですか?



そもそも sizeof が何をするものかは理解できていますか?
    • good
    • 0

sizeof演算子は、データ型や構造体で確保した記憶領域の大きさを、


整定数のバイト数で表すものです。通常、この記憶領域の大きさの計算はコンパイル時に行われます。
~はじめての”C”より~

コンパイル時に行われるということは、実行時に何を代入しようが、
どのようにメモリーを壊そうが関係ないということです。

コンパイル時ということですから、コンパイル後のコードを見ると、
printf("%d", sizeof(name));  ではなく、
printf("%d", 10);       となっています。
    • good
    • 0
この回答へのお礼

そうですね。10になりますよね。11は正解を見間違いしていました。

お礼日時:2014/07/04 13:46

コードを載せるときは、回答しようとする側で


そのままコンパイルできるよう、極力省略しないでいただければ、
と思います。

さて、私のところで下記のコードを実行したところ、
10
という結果を得ました。

#include <stdio.h>
#include <string.h>

union Name
{
char firstName[10];
char lastName[10];
};

int main(void)
{
union Name name;

strcpy(name.firstName, "Dennis");
strcpy(name.lastName, "Ritchie");
printf("%s\n", name.firstName);
printf("%s\n", name.lastName);
printf("%d\n", sizeof(name));
return 0;
}
    • good
    • 0
この回答へのお礼

余分なものは省略した方がシンプルで見やすいかなと思いました。以後気を付けます。

お礼日時:2014/07/04 13:41

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