union U {
char s[9]; // 9 bytes
int n; // 4 bytes
double d; // 8 bytes
};
// 所有成員起始位址相同
// 實際大小 = 16 bytes (非 9!)
滿足兩條件:
#includeusing namespace std; union U1 { char s[9]; int n; double d; }; // sizeof = 16 union U2 { char s[5]; int n; double d; }; // sizeof = 8 int main() { U1 u1; U2 u2; printf("%d\n", sizeof(u1)); // 16 printf("%d\n", sizeof(u2)); // 8 // 驗證基址相同 printf("0x%x\n", &u1); printf("0x%x\n", &u1.s); printf("0x%x\n", &u1.n); printf("0x%x\n", &u1.d); // 全部相同 // 資料重疊實驗 u1.n = 1; // 記憶體前4 bytes: 01 00 00 00 printf("%d\n", u1.s[0]); // 1 (小端序) printf("%lf\n", u1.d); // 0.000000 (解讀為 double) // 逐 byte 檢視 unsigned char *p = (unsigned char *)&u1; for(int i=0;i<8;i++) printf("%d\n", *(p+i)); // 輸出: 1,0,0,0, 48,204,64,0 (double 0.0 的記憶體模式) return 0; }
| 操作 | 記憶體變化 | 讀取其他成員結果 |
|---|---|---|
u.n = 1 | 前 4 bytes = 01 00 00 00 | u.s[0] == 1, u.d ≈ 0 |
u.d = 1.0 | 8 bytes IEEE 754 模式 | u.n 變為解讀後的整數 |
union { float f; uint32_t bits; } converter;
converter.f = 3.14f;
printf("0x%08X\n", converter.bits); // 0x4048F5C3
union Packet {
struct { uint16_t cmd; uint16_t len; char data[12]; } fields;
char raw[16];
};
union State {
struct { uint8_t flag; int value; } active;
struct { uint8_t flag; char err_msg[16]; } error;
};
