C言語 - カスタムタイプ3

コンソーシアム

コンソーシアムの定義

Union は特殊なカスタム型で、この型で定義される変数にも多くのメンバー (型は異なっていてもよい) が含まれており、これらのメンバーが同じメモリ空間を共有するのが特徴です。
例えば:

union My       //定义联合体类型
{
    
    
	char c;
	int i;
};
union My   un;    //定义联合体变量

int main()
{
    
    
	printf("%zd\n", sizeof(un));     //计算联合体变量大小
	return 0;
}

連邦の特徴

共用体のメンバーは同じメモリ空間を共有します。つまり、共用体のサイズは少なくとも最大のメンバーのサイズになります。

union Un
{
    
    
	char a;
	int i;
}un;
int main()
{
    
    
	printf("%p\n", &(un.a));    //查看一下两个成员的地址
	printf("%p\n", &(un.i));

	return 0;
}

ここに画像の説明を挿入
これにより、それらがすべて同じメモリ空間を共有していることも検証されます。

ユニオンサイズの計算

  • ユニオンのサイズは少なくとも最大のメンバーのサイズである
  • 最大のメンバーのサイズが最大アライメントの整数倍ではない場合、最大アライメントの整数倍にアライメントする必要があります。
    例えば:
union Un1
{
    
    
	char c[5];     //最大成员是5,最大对齐数是四,所以对齐到8
	int i;
};
union Un2
{
    
    
	short c[7];      //最大成员是14,最大对齐数是4,所以对齐到16
	int i;
};
int main()
{
    
    
	printf("%zd\n", sizeof(union Un1));
	printf("%zd\n", sizeof(union Un2));

	return 0;
}

ここに画像の説明を挿入

使用例

int daxiao()
{
    
    
	union Un
	{
    
    
		char a;     //一个字节
		int i;      //四个字节
	}un;
	un.i = 1;
	return un.a;

}
int main()
{
    
    
	int ret = daxiao();
	if (ret)
		printf("小端");
	else
		printf("大端");
	return 0;
}

ここに画像の説明を挿入
ここに画像の説明を挿入
読み取られる最初のバイトは、リトル エンディアン ストレージの場合は 1、ビッグ エンディアン ストレージの場合は 0 です。

おすすめ

転載: blog.csdn.net/st200112266/article/details/127280522