[解決済み] ストラクチャーとユニオンの違い
質問
の違いを説明する良い例はありますか?
struct
と
union
?
基本的に私は
struct
はそのメンバーのすべてのメモリを使用し
union
は、最大のメンバーのメモリ空間を使用します。他にOSレベルでの違いはあるのでしょうか?
解決方法は?
ユニオンの場合、すべての要素が同じ場所に格納されるため、どちらか一方だけを使用することになります。そのため、複数の型のいずれかになり得るものを格納したい場合に有効です。一方、構造体は、各要素が別々のメモリに格納され、すべてを一度に使用することができます。
具体的な使用例を挙げると、少し前にSchemeのインタプリタを作っていて、Schemeのデータ型をCのデータ型に重ねるということをやっていたんです。これは、構造体の中に値の型を示すenumとその値を格納するユニオンを格納するものだった。
union foo {
int a; // can't use both a and b at once
char b;
} foo;
struct bar {
int a; // can use both a and b simultaneously
char b;
} bar;
union foo x;
x.a = 3; // OK
x.b = 'c'; // NO! this affects the value of x.a!
struct bar y;
y.a = 3; // OK
y.b = 'c'; // OK
を編集します。 x.bを'c'にするとx.aの値がどう変わるのかというと、技術的に言えば未定義です。最近のマシンではcharは1バイト、intは4バイトなので、x.bに'c'を与えると、x.aの最初のバイトも同じ値になります。
union foo x;
x.a = 3;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);
印刷物
99, 99
なぜ2つの値が同じなのでしょうか?int 3の最後の3バイトはすべて0なので、99とも読めるからです。x.aにもっと大きな数字を入れると、必ずしもそうではないことがわかります。
union foo x;
x.a = 387439;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);
印刷物
387427, 99
実際のメモリの値を詳しく見るために、16進数で値を設定し、プリントアウトしてみましょう。
union foo x;
x.a = 0xDEADBEEF;
x.b = 0x22;
printf("%x, %x\n", x.a, x.b);
印刷物
deadbe22, 22
0x22が0xEFを上書きしているのがよくわかると思います。
しかし
C言語では、intのバイトの並び順は は定義されていません。 このプログラムは私のMacでは0xEFを0x22で上書きしていますが、他のプラットフォームではintを構成するバイトの順番が逆になっているので、代わりに0xDEを上書きしてしまうものがあります。したがって、プログラムを書くときには、ユニオンの中の特定のデータを上書きする動作は移植性がないので、決して当てにしない方がよいでしょう。
バイトの並び順についてもっと詳しく知りたい方は エンディアン .
関連
-
解決済み] g++ コンパイルエラー: ')'トークンの前に一次式があることが予想される
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] C++のstructとclassの違いは何ですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
関数 'malloc' の暗黙の宣言に対する解決策
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] Windows用Cコンパイラ?[クローズド]
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?