Z
ZHANK
结构体与内存

联合体 union

union 共享内存、大小端判断、union 与 struct 的区别

联合体 union

union 的所有成员共享同一块内存——同一时刻只有一个成员有效。适合节省内存,或者用来查看数据的另一种表示。

学完本章你将: 理解共享内存、用 union 判断大小端、union vs struct。


union 基础

c
#include <stdio.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    union Data d;

    d.i = 42;
    printf("d.i = %d\n", d.i);   // 42

    d.f = 3.14;                   // 覆盖了 d.i!
    printf("d.f = %f\n", d.f);   // 3.140000
    printf("d.i = %d\n", d.i);   // 垃圾值——已被覆盖

    return 0;
}

💡 union 的大小 = 最大成员的大小。所有成员从同一地址开始。


判断 CPU 大小端

c
#include <stdio.h>

int main() {
    union {
        int i;
        char c[4];
    } endian = { .i = 1 };

    if (endian.c[0] == 1) {
        printf("小端(Little Endian)\n");  // x86 架构
    } else {
        printf("大端(Big Endian)\n");
    }
    return 0;
}

union + struct 组合(常用模式)

c
typedef struct {
    int type;  // 0=整数, 1=浮点数
    union {
        int iVal;
        float fVal;
    } value;
} Variant;

void print(Variant v) {
    if (v.type == 0) printf("int: %d\n", v.value.iVal);
    else             printf("float: %f\n", v.value.fVal);
}