P61 枚举和共用体大小计算

在C语言中,枚举(enum)和共用体(union)的大小计算方式略有不同,下面分别解释:

枚举(enum

枚举本身不占用存储空间,它只是一个类型别名,用于为整数值提供有意义的名称。但是,枚举值在内存中以整数的形式存在。枚举类型的大小取决于编译器和具体的实现,但通常它的大小与能够容纳枚举中最大值的整数类型的大小相同。例如,如果枚举中的值都是非负的,并且小于256,那么枚举类型的大小可能是一个unsigned char(8位)。如果枚举中的值超过了int的范围,编译器可能会使用longlong long类型来存储枚举值。

需要注意的是,枚举类型的大小并不是固定的,因此不能像结构体(struct)或共用体(union)那样直接通过sizeof操作符来获取其大小。但是,你可以通过声明一个枚举类型的变量,并使用sizeof操作符来获取该变量的大小,从而间接地了解枚举类型的大小。

共用体(union

共用体的大小是其所有成员中最大的那个成员的大小。因为共用体的所有成员都使用同一块内存空间,所以整个共用体的大小不能小于其任何一个成员的大小。你可以使用sizeof操作符来获取共用体的大小。

例如:

union MyUnion {
char c;
int i;
double d;
};
printf("Size of MyUnion: %zu\n", sizeof(union MyUnion)); // 输出可能是 4, 8, 16 等,取决于系统和编译器

在这个例子中,union MyUnion的大小将是charintdouble类型中最大的那个类型的大小。在大多数现代系统上,double类型的大小通常是8字节(64位),因此union MyUnion的大小很可能是8字节。但是,这取决于具体的系统和编译器实现。

需要注意的是,尽管共用体可以包含不同类型的成员,但一次只能使用其中一个成员,因为所有成员都共享同一块内存空间。在访问共用体的成员之前,你通常需要设置一个标志或使用其他机制来跟踪当前正在使用哪个成员。

上面共用体的大小计算说的并不准确

实际上:

1.联合的大小至少是最大成员的大小。

2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

union Un1

{

char c[5];  //数组总大小为5,故该联合体大小至少是5,又元素类型为char,大小是1,对齐数也是1

int i;  //大小是4,小于VS默认对齐数8,故此对齐数为4

};  //4>1,故此联合体的最大对齐数是4,5不是4的整数倍,因此联合体的大小为4*2=8

union Un2

{

short c[7];  //数组总大小为7*2=14,故该联合体大小至少是14,又元素类型为short,大小是2,对齐数也是2

int i; //对齐数是4

};  //4>2,故此联合体的最大对齐数是4,14不是4的整数倍,因此联合体的大小为4*4=16

//下面输出的结果是什么?

printf("%d\n", sizeof(union Un1));  //输出:8

printf("%d\n", sizeof(union Un2));  //输出:16

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值