single
Unions
メニューを表示するにはスワイプしてください
ユニオンは、C言語におけるユーザー定義のデータ型であり、構造体と似ています。主な違いは、すべてのメンバーが同じメモリ領域を共有する点です。任意の時点で、1つのメンバーのみが値を保持できます。
ユニオンは使用頻度は高くありませんが、メモリを節約しつつ、異なる型のデータを異なるタイミングで保持したい場合に便利です。
すべてのメンバーのデータは同じメモリ領域に配置される。 つまり、ユニオンのすべてのメンバーは同じメモリアドレスを共有し、ユニオンのサイズは最も大きいメンバーのサイズと等しい。
ユニオンの主な用途は、異なるデータ型を1つの共通メモリ領域に重ね合わせることであり、1つのメモリ領域を異なるデータ型として表現すること。
ユニオンではフィールドが同じメモリセル内にあるため、同じデータを異なる方法で処理することが可能です。
main.c
12345678910111213141516#include <stdio.h> // declaring a union union Data { int a; char b; } data; int main() { data.a = 77; // assigning a value to variable a printf("Value of data.a: %d\n", data.a); printf("Value of data.b: %c\n", data.b); return 0; }
この例では、変数 data.a と data.b は同じメモリを共有しています。a に値 77 を代入しましたが、同じバイト列を b で文字として解釈することができます。
共用体におけるアライメント
構造体と同様に、共用体もアライメントとパディングを使用。コンパイラは、各メンバーが適切なメモリ境界で開始されるように追加のバイトを挿入する場合がある。
main.c
12345678910111213#include <stdio.h> union Data { int a; // 4 bytes double b; // 8 bytes char c[20]; // 20 bytes }; int main() { printf("Size of union Data: %zu bytes\n", sizeof(union Data)); return 0; }
共用体は一度に1つの値のみを格納でき、そのサイズは最も大きいメンバーのサイズに等しい。int a(4バイト)、double b(8バイト)、char c[20]を持つ例では、共用体の最小サイズは20バイト。ただし、コンパイラがアライメントのために追加のバイトを挿入し、doubleやintが適切なメモリ境界で開始されるようにする。その結果、sizeof(union Data)は20より大きくなる場合があり、例えば24バイトとなることがある。
スワイプしてコーディングを開始
ユニオン Data は各値を int として格納し、同じ値に char としてアクセスできるようにします。この関数は配列を反復処理し、各値を整数と対応するASCII文字の両方で出力します。
関数は2つのパラメータを受け取ります:整数の配列(values)とその長さ(n)。
- 2つのメンバー
union Dataとint aを持つchar bを使用。 forループで配列要素を0からnまで反復処理。- 配列の現在の要素をユニオンの
intメンバー(data.a)に代入。 - 整数値
data.aと文字表現data.bを出力。
例
{65, 66, 67, 68, 69} =>
Value as int: 65, Value as char: A
Value as int: 66, Value as char: B
Value as int: 67, Value as char: C
Value as int: 68, Value as char: D
Value as int: 69, Value as char: E
解答
フィードバックありがとうございます!
single
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください