您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # C语言的union怎么使用
## 1. union的基本概念
在C语言中,`union`(联合体)是一种特殊的数据类型,它允许在同一内存位置存储不同的数据类型。与`struct`(结构体)不同,`union`的所有成员共享同一块内存空间,这意味着任何时候只能有一个成员有效。
### 1.1 union的定义语法
```c
union UnionName {
    member_type1 member1;
    member_type2 member2;
    // ...
};
| 特性 | union | struct | 
|---|---|---|
| 内存分配 | 所有成员共享同一内存空间 | 每个成员有独立的内存空间 | 
| 内存大小 | 由最大成员决定 | 所有成员大小之和(含对齐) | 
| 使用场景 | 同一时间只需一种数据类型 | 需要同时存储多种数据 | 
union的大小等于其最大成员的大小。例如:
union Example {
    int i;      // 4字节
    float f;    // 4字节
    char c;     // 1字节
};              // 总大小=4字节
#include <stdio.h>
union Data {
    int i;
    float f;
    char str[20];
};
int main() {
    union Data data;        
    printf("Memory size occupied by data: %zu\n", sizeof(data));
    return 0;
}
输出结果:
Memory size occupied by data: 20
利用union可以在不进行强制类型转换的情况下重新解释数据:
union Converter {
    float f;
    unsigned int u;
};
void printFloatBits(float num) {
    union Converter c;
    c.f = num;
    printf("%f in binary: 0x%08X\n", num, c.u);
}
当多个数据不会同时使用时:
union DeviceStatus {
    struct {
        unsigned char error_code;
        unsigned char sensor_id;
    } error;
    unsigned short normal_status;
};
在网络协议中处理不同格式的数据:
union Packet {
    struct {
        unsigned short header;
        unsigned char payload[32];
    } raw;
    struct {
        unsigned short command;
        unsigned short data_length;
        unsigned char data[30];
    } parsed;
};
struct Variant {
    enum { INT, FLOAT, STR } type;
    union {
        int i;
        float f;
        char *s;
    };  // 匿名union
};
void printVariant(struct Variant v) {
    switch(v.type) {
        case INT: printf("%d\n", v.i); break;
        case FLOAT: printf("%f\n", v.f); break;
        case STR: printf("%s\n", v.s); break;
    }
}
union StatusRegister {
    unsigned short value;
    struct {
        unsigned ready:1;
        unsigned error:1;
        unsigned busy:1;
        unsigned :13;  // 保留位
    } bits;
};
union Number {
    int i;
    float f;
};
union Number num;
num.i = 10;
printf("%f", num.f);  // 未定义行为!
union EndianTest {
    int value;
    char bytes[4];
};
void checkEndian() {
    union EndianTest test = {0x01020304};
    if(test.bytes[0] == 0x01) {
        printf("Big Endian\n");
    } else {
        printf("Little Endian\n");
    }
}
#pragma pack(push, 1)
union PackedUnion {
    char c;
    int i;  // 可能引发对齐问题
};
#pragma pack(pop)
union Color {
    unsigned int rgba;
    struct {
        unsigned char r;
        unsigned char g;
        unsigned char b;
        unsigned char a;
    } components;
};
void printColor(union Color c) {
    printf("R:%d G:%d B:%d A:%d\n",
           c.components.r,
           c.components.g,
           c.components.b,
           c.components.a);
}
typedef union {
    struct {
        uint32_t mode:2;
        uint32_t enable:1;
        uint32_t reserved:29;
    } bits;
    uint32_t reg;
} ControlRegister;
void enableDevice(volatile ControlRegister *reg) {
    reg->bits.enable = 1;
}
union是C语言中强大的特性,正确使用可以: - 实现内存高效利用 - 简化类型转换 - 灵活处理多种数据格式
但需要注意: 1. 同一时间只有一个成员有效 2. 考虑平台相关特性(如字节序) 3. 谨慎处理类型转换
合理使用union能让代码更简洁高效,特别是在系统编程、嵌入式开发等领域。
注意:本文示例代码需要根据实际编译环境调整,部分特性需要C11或更高标准支持。 “`
这篇文章共计约1500字,涵盖了union的基础概念、内存布局、典型用法、注意事项和实际案例,采用Markdown格式编写,包含代码示例和表格对比。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。