Saturday, September 1, 2018

C - 共用体

共用体は、同じメモリ位置に異なるデータ型を格納することを可能にする特殊なデータ型です。 多くのメンバーを持つ共用体を定義できますが、一度に1つのメンバーしか値を入れることはできません。 ユニオンは、多目的に同じメモリロケーションを使用する効率的な方法を提供します。

組合の定義
共用体を定義するには、構造体の定義時と同じ方法で共用体文を使用する必要があります。 unionステートメントは、プログラムに複数のメンバーを持つ新しいデータ型を定義します。 union文の書式は次のとおりです
union [union tag] {
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables]; 
共用体タグはオプションで、各メンバ定義はint iなどの通常の変数定義です。 またはフロートf。 またはその他の有効な変数定義を使用します。 ユニオンの定義の最後で、最後のセミコロンの前に、1つ以上の共用体変数を指定できますが、オプションです。 ここでは、3つのメンバーi、f、およびstrを持つDataという名前の共用体タイプを定義する方法を示します
union Data {
   int i;
   float f;
   char str[20];
} data;  
これで、Data型の変数は、整数、浮動小数点数、または文字列を格納できます。 これは、単一の変数、すなわち同じメモリ位置を使用して、複数のタイプのデータを格納することができることを意味する。 必要条件に基づいて、組み込みの内部またはユーザー定義のデータ型を使用することができます。

組合が占める記憶は、組合の最大の構成員を収容するのに十分な大きさになります。 たとえば、上記の例では、データ型は、文字列が占めることができる最大の領域であるため、20バイトのメモリ領域を占有します。 次の例は、上記の共用体が占める合計メモリー・サイズを表示します
#include <stdio.h>
#include <string.h>
 
union Data {
   int i;
   float f;
   char str[20];
};
 
int main( ) {

   union Data data;        

   printf( "Memory size occupied by data : %d\n", sizeof(data));

   return 0;
}
Memory size occupied by data : 20


ユニオンメンバーへのアクセス
共用体のメンバーにアクセスするには、メンバーアクセス演算子(。)を使用します。 メンバーアクセス演算子は、アクセスしたいユニオン変数名とユニオンメンバーの間のピリオドとしてコード化されています。 Union型の変数を定義するには、キーワードunionを使用します。 次の例は、プログラムで共用体を使用する方法を示しています。
#include <stdio.h>
#include <string.h>
 
union Data {
   int i;
   float f;
   char str[20];
};
 
int main( ) {

   union Data data;        

   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");

   printf( "data.i : %d\n", data.i);
   printf( "data.f : %f\n", data.f);
   printf( "data.str : %s\n", data.str);

   return 0;
}
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

ここでは、変数に割り当てられた最終的な値がメモリ位置を占めていたため、組合員のiとfメンバーの値が壊れていることがわかります。これがstrメンバーの値がうまく印刷されている理由です。

今度は同じ例をもう一度見てみましょう。ここでは、一度に1つの変数を使用します。これは、ユニオンを持つことの主な目的です

#include <stdio.h>
#include <string.h>
 
union Data {
   int i;
   float f;
   char str[20];
};
 
int main( ) {

   union Data data;        

   data.i = 10;
   printf( "data.i : %d\n", data.i);
   
   data.f = 220.5;
   printf( "data.f : %f\n", data.f);
   
   strcpy( data.str, "C Programming");
   printf( "data.str : %s\n", data.str);

   return 0;
}
data.i : 10
data.f : 220.500000
data.str : C Programming

ここでは、一度に1人のメンバーが使用されているため、すべてのメンバーが非常にうまく印刷されています。






No comments:

Post a Comment

Interfaces and their protocol stacks

インタフェースとそのプロトコルスタック 主要なネットワーク要素に精通した後、これら要素間のインタフェースをよりよく知る時期が来ています。 インタフェースは、MME、SGWおよびPGWが他のネットワーク要素(例えば、HSSまたはPCRF)と協働することを可能にする。 それらの...