联合类型的定义
这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块地址(所以也叫共用体)。
union Un
{
char c;
int i;
};
int main()
{
union Un u;
printf("%d\n", sizeof(u));
printf("%p\n", &u);
printf("%p\n", &(u.c));
printf("%p\n", &(u.i));
return 0;
}//这里打印的结果是4 和三个相同的地址
这里不难看出c与i公用同一空间
对于联合体的成员,同一时间只能使用一个
联合的特点
联合的成员是公用同一块内存的,所以联合的大小至少是联合中最大成员的大小(联合至少得有能力保存那个最大的成员)
在判断当前编译器大小端存储时,
除了:
#include<stdio.h>
int main()
{
int i = 1;
if (1 == *(char*)&i)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
还可以:
#include<stdio.h>
int little_or_big_endian()
{
union Un
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
int main()
{
if (1 == little_or_big_endian())
{
printf("小端\n");
}
else
{
printf("大端\n");
}
}
联合大小的计算
联合的大小至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
#include<stdio.h>
union Un1
{
char c[5];//5
int i;//4
};
union Un2
{
short arr[7];//14
int i;//4
};
int main()
{
printf("%d", sizeof(union Un1));
printf("%d", sizeof(union Un2));
return 0;
}//这里打印的结果是:8 16
本文详细介绍了联合类型(共用体)的概念,指出其成员共享同一块内存空间,同时讨论了联合体的特点,如大小至少为最大成员的大小,并展示了如何利用联合体判断系统的小端或大端存储。此外,还探讨了联合大小的计算规则,通过实例展示了当最大成员大小不是最大对齐数的整数倍时如何进行内存对齐。
1900

被折叠的 条评论
为什么被折叠?



