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となります。これはなぜでしょうか?
宜しくお願い致します。
No.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を使えば、期待するサイズが得られるのではないでしょうか?
sizeofが分からないと思っていましたが、unionが分かっていないのではと気付いて解説して下さったTreatMeGentlyさんをベストアンサーにしたいと思います。ありがとうございました!
No.4
- 回答日時:
unionで宣言すると共用体になるので10ですね。
structの構造体宣言なら20になります。
プログラムからするとstructの間違いでは?
http://www.comb.kokushikan.ac.jp/~ken/blogn/sb/c …
No.2
- 回答日時:
sizeof演算子は、データ型や構造体で確保した記憶領域の大きさを、
整定数のバイト数で表すものです。通常、この記憶領域の大きさの計算はコンパイル時に行われます。
~はじめての”C”より~
コンパイル時に行われるということは、実行時に何を代入しようが、
どのようにメモリーを壊そうが関係ないということです。
コンパイル時ということですから、コンパイル後のコードを見ると、
printf("%d", sizeof(name)); ではなく、
printf("%d", 10); となっています。
No.1
- 回答日時:
コードを載せるときは、回答しようとする側で
そのままコンパイルできるよう、極力省略しないでいただければ、
と思います。
さて、私のところで下記のコードを実行したところ、
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- 営業・販売・サービス 仕入れの方法 1 2023/05/21 18:55
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- フリーソフト Googleスプレッドシートで特定の言葉が含まれる行の色分けをしたいのですが 4 2022/04/30 15:29
- JavaScript gasについて 1 2022/05/31 21:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
C言語をコンパイルするとコンピ...
-
Eclipseで使えるコンパイラ、リ...
-
すべてのリビルド: 0 正常、 0 ...
-
C#で char型とstring型の比較で...
-
Linux(g++)とAIX(XL C++)の挙動...
-
ビープ音が鳴りません・・・
-
プレコンパイルの意味を教えて...
-
libsshのコンパイルエラー
-
c言語です コンパイルした時に...
-
[COBOL] ソースの復帰
-
VBで作成したOCXでバージョンが...
-
VBA と コンパイル の関係
-
VC++6.0の混在モード
-
Verilog_HDLでのdefineとifdef
-
C90とC99の計算結果の違い?
-
NASMとMASMの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
C言語をコンパイルするとコンピ...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
ビープ音が鳴りません・・・
-
c言語です コンパイルした時に...
-
<math.h>ヘッダを入力している...
-
C#で char型とstring型の比較で...
-
共有ライブラリの内容確認について
-
すべてのリビルド: 0 正常、 0 ...
-
[COBOL] ソースの復帰
-
64ビットのlinuxで32ビットメモ...
-
VS2010環境で2点ほど質問
-
gcc バージョン違いによるコン...
-
ヘッダーファイル『windows.h』...
-
C言語で作ったらWindowsでもMac...
-
自作DLLの中身を暗号化
-
MVSマシンで0C7でABENDしたので...
-
Verilog_HDLでのdefineとifdef
おすすめ情報