联合体内存大小

#include <stdio.h>
 
// 定义一个联合体
union Data {
    int i;
    float f;
    char c;
    char d[40];
};
 
int main() {
    union Data data; // 声明一个联合体变量data
    printf("Data len = %d\n", sizeof(data)); // 输出整数成员的值
    data.i = 42; // 给联合体的整数成员赋值
    printf("data.i = %d\n", data.i); // 输出整数成员的值
 
    data.f = 3.14; // 给联合体的浮点数成员赋值
    printf("data.f = %.2f\n", data.f); // 输出浮点数成员的值
 
    data.c = 'A'; // 给联合体的字符成员赋值
    printf("data.c = %c\n", data.c); // 输出字符成员的值
 
    // 注意:联合体的不同成员共享同一块内存空间,赋值一个成员会影响其他成员的值
    printf("data.i = %d, data.f = %.2f, data.c = %c\n", data.i,data.f, data.c);
    
    //data.i = 1078523201, data.f = 3.14, data.c = A
   printf("Data len = %d\n", sizeof(data)); // 输出整数成员的值
    return 0;
}

运行结果

标准输出:Data len = 40
data.i = 42
data.f = 3.14
data.c = A
data.i = 1078523201, data.f = 3.14, data.c = A
Data len = 40

如果联合体如下: 

// 定义一个联合体
union Data {
    int i;
    float f;
    char c;
};

则运行结果如下:

标准输出:Data len = 4
data.i = 42
data.f = 3.14
data.c = A
data.i = 1078523201, data.f = 3.14, data.c = A
Data len = 4

理解为最大len,也从另一面印证了联合体共用一段内存。

联合体的场景应用:

方法1:

UINT StrLength = 0x12345678;  // 原始值
UINT8 BufferTemp[4];

// 小端序(低字节在前,x86架构常用)
BufferTemp[0] = (UINT8)(StrLength);         // 0x78
BufferTemp[1] = (UINT8)(StrLength >> 8);    // 0x56
BufferTemp[2] = (UINT8)(StrLength >> 16);   // 0x34
BufferTemp[3] = (UINT8)(StrLength >> 24);   // 0x12

// 大端序(高字节在前,网络传输常用)
BufferTemp[0] = (UINT8)(StrLength >> 24);  // 0x12
BufferTemp[1] = (UINT8)(StrLength >> 16);   // 0x34
BufferTemp[2] = (UINT8)(StrLength >> 8);    // 0x56
BufferTemp[3] = (UINT8)(StrLength);        // 0x78

方法2:

UINT StrLength = 0x12345678;
UINT8 BufferTemp;

// 方法 2.1:指针强制转换
UINT8* p = (UINT8*)&StrLength;
for (UINTN i = 0; i < sizeof(UINT); i++) {
  BufferTemp[i] = p[i];  // 结果依赖平台字节序
}

// 方法 2.2:联合体(Union)
union {
  UINT  Integer;
  UINT8 Bytes;
} Converter;
Converter.Integer = StrLength;
CopyMem(BufferTemp, Converter.Bytes, 4);  // 同样依赖平台字节序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值