- ベストアンサー
Sizeofが分かりません
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となります。これはなぜでしょうか? 宜しくお願い致します。
- みんなの回答 (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を使えば、期待するサイズが得られるのではないでしょうか?
その他の回答 (4)
- tsunji
- ベストアンサー率20% (196/958)
unionで宣言すると共用体になるので10ですね。 structの構造体宣言なら20になります。 プログラムからするとstructの間違いでは? http://www.comb.kokushikan.ac.jp/~ken/blogn/sb/c/archives/2005/02/post_8.html
- Tacosan
- ベストアンサー率23% (3656/15482)
「よくわかりません」ということだけど, どこまでわかってどこで困っているのですか? そもそも sizeof が何をするものかは理解できていますか?
- maiko0318
- ベストアンサー率21% (1483/6969)
sizeof演算子は、データ型や構造体で確保した記憶領域の大きさを、 整定数のバイト数で表すものです。通常、この記憶領域の大きさの計算はコンパイル時に行われます。 ~はじめての”C”より~ コンパイル時に行われるということは、実行時に何を代入しようが、 どのようにメモリーを壊そうが関係ないということです。 コンパイル時ということですから、コンパイル後のコードを見ると、 printf("%d", sizeof(name)); ではなく、 printf("%d", 10); となっています。
お礼
そうですね。10になりますよね。11は正解を見間違いしていました。
- asuncion
- ベストアンサー率33% (2127/6289)
コードを載せるときは、回答しようとする側で そのままコンパイルできるよう、極力省略しないでいただければ、 と思います。 さて、私のところで下記のコードを実行したところ、 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; }
お礼
余分なものは省略した方がシンプルで見やすいかなと思いました。以後気を付けます。
お礼
sizeofが分からないと思っていましたが、unionが分かっていないのではと気付いて解説して下さったTreatMeGentlyさんをベストアンサーにしたいと思います。ありがとうございました!