# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。