C语言中的union是什么?怎么声明和访问?

来源:这里教程网 时间:2026-02-21 17:18:49 作者:

c语言中的union是一种共享内存的数据结构,其核心特点是同一时间只能存储一个成员。它与struct不同,union所有成员共享一块内存,大小由最大成员决定,而struct为每个成员分配独立空间。声明方式类似结构体,使用union关键字定义,例如:union data { int i; float f; char str[20]; }; 声明变量时可直接定义或在定义后声明。访问union成员通过.操作符进行,如data.i = 10; 若对另一个成员赋值,如data.f = 22.5,则之前成员的值会被覆盖。可用指针访问成员,如union data *pdata = &data; union常见用途包括节省内存、类型转换、实现变体类型(如配合类型标识符的通用value结构)。使用时需注意避免访问未初始化或已覆盖的成员,关注内存对齐差异,并推荐结合类型标志使用以确保安全性和可读性。

C语言中的union是什么?怎么声明和访问?

Union在C语言中是一种特殊的数据结构,它允许你在同一个内存空间里存储不同的数据类型,但同一时间只能存储其中一个。这跟结构体(struct)不同,结构体会为每个成员分配独立的内存空间,而union则是所有成员共享一块足够大的内存,这块内存的大小由最大的成员决定。

声明一个Union

声明一个union的方式和结构体类似,使用关键字

union
,然后可以定义一组成员变量。例如:

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

这个例子定义了一个名为

Data
的联合体,它可以存储一个整型、一个浮点数或者一个字符串。但是注意,它们共享同一块内存空间,所以当你写入一个新的值到其中一个成员时,之前写入的其他成员的值会被覆盖。

立即学习“C语言免费学习笔记(深入)”;

你可以像结构体一样声明一个union变量:

union Data data;

也可以在定义的时候直接声明:

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

如何访问Union的成员

访问union成员的方式也跟结构体类似,使用

.
操作符:

data.i = 10;
printf("%d\n", data.i);

如果你给另一个成员赋值:

data.f = 22.5;
printf("%f\n", data.f);

此时再打印

data.i
,它的值就不是10了,因为
i
f
共享内存空间。具体输出什么值取决于你当前写入的是哪个成员,以及内存如何解释这部分数据。

有些时候你会用指针来访问union成员,比如:

union Data *pData = &data;
pData->i = 30;
printf("%d\n", pData->i);

这种方式也很常见,特别是在处理底层数据或通信协议时。

Union的实际用途

节省内存:如果你需要一个变量能表示不同类型的数据,但不需要同时保存多个值,union非常适合这种情况。 类型转换或内存解析:比如从网络接收一段二进制数据,你可以用union把它解释成不同的结构。 实现变体类型(variant type):比如你想让一个变量既可以是整数也可以是字符串,就可以用union配合一个类型标识符一起使用。

举个简单的例子,如果你想实现一个通用的“值”类型:

struct Value {
    int type;  // 0 表示int,1 表示float,2 表示字符串
    union {
        int i;
        float f;
        char str[32];
    };
};

这样你就可以根据

type
字段判断当前应该读取哪个union成员。

注意事项

访问未初始化或已覆盖的union成员会导致不可预测的结果。 不同平台下对union内存对齐方式可能有差异,需要注意跨平台兼容性问题。 尽量配合一个类型标志一起使用,否则很难知道当前union里面存的是什么。

基本上就这些。Union在C语言中是一个非常实用但也容易出错的工具,用好了能提升效率,用不好可能导致数据混乱。

相关推荐