C语言联合体Union特点及运用全面讲解教程

Jasper
Jasper
发布时间:2026-10-13| 5人浏览过
原创

C语言联合体(Union)允许不同数据类型的成员共用同一块内存空间。本文将详解其核心特点、内存对齐规则,并通过实战代码演示如何快速检测系统的字节序。

一、联合体的基本定义

联合体是一种特殊的自定义数据类型,与结构体类似,它包含多个成员变量。但最本质的区别在于:联合体所有成员共用同一块内存空间。因此,联合体也被称为共用体。

以下代码展示了联合体的声明方式及其内存布局:

#include <stdio.h>

union Un 
{
	char c;  // 1字节
	int i;   // 4字节
};

int main()
{
	union Un u = {0};
	// 输出联合体总大小
	printf("Size of union: %d\n", sizeof(u));
	// 输出各成员的内存地址
	printf("Address of u: %p\n", &u);
	printf("Address of u.c: %p\n", &(u.c));
	printf("Address of u.i: %p\n", &(u.i));
	return 0;
}

通过运行上述代码可以发现:
1. sizeof(u) 的结果为 4 字节,即等于其中最大成员(int i)的大小。
2. 联合体变量 u 与其成员 u.c 和 u.i 的地址完全相同,这证明了它们是共用同一块内存起始位置的。

关键注意点:由于内存重叠,修改其中一个成员的值会直接影响其他成员。例如,修改 u.c 可能会改变 u.i 的低字节部分。因此,在程序逻辑中,同一时刻通常只应使用一个联合体成员,否则极易引发不可预知的错误。

二、联合体的实际应用:检测内存字节序

利用联合体“共用内存”且“首地址相同”的特性,可以非常优雅地判断当前系统是大端存储(Big-Endian)还是小端存储(Little-Endian)。

原理:将整数 1 存入联合体的 int 成员,然后读取 char 成员(占1字节)。若 char 的值为 1,说明整数的低位字节存储在低地址,即为小端模式;反之则为大端模式。

代码如下:

union U
{
	char c;
	int i;
} u; // 直接创建联合体实例

int main()
{
	u.i = 1; 
	// 内存布局示意(十六进制):
	// 0x 00 00 00 01
	// 低地址 --------> 高地址
	
	// 小端存储:低位放低地址 (01 00 00 00)
	// 大端存储:低位放高地址 (00 00 00 01)
	
	if (u.c == 1)
	{
		printf("System is Little Endian.\n");
	}
	else
	{
		printf("System is Big Endian.\n");
	}
	return 0;
}

该方法利用了 u.c 始终位于联合体内存起始位置的特性,只需判断初始字节的值即可完成检测。

三、联合体大小的计算规则

计算联合体大小需要遵循两个核心原则:
1. 联合体的大小至少是最大成员的大小。
2. 当最大成员的大小不是最大对齐数(Alignment)的整数倍时,需向上对齐到最大对齐数的整数倍。

第1步:分析成员对齐数

首先确定每个成员自身的对齐数,以及联合体的最大对齐数。

第2步:确定最大成员大小

找出占用空间最大的成员。

第3步:执行对齐计算

若最大成员大小能被最大对齐数整除,则直接取该值;否则,向上取整到下一个对齐倍数。

示例 Un1 解析:

union Un1
{
	char c[5]; // char数组,总大小5字节,对齐数为1
	int i;     // int类型,大小4字节,默认对齐数通常为4或8(此处按4计算)
};
  • int i 的对齐数通常为4。
  • 最大对齐数为4。
  • 最大成员大小为 char c[5] 的 5 字节。
  • 5 不是 4 的倍数,需向上对齐至 8 的倍数。因此 sizeof(union Un1) = 8 字节。

示例 Un2 解析:

union Un2
{
	short c[7]; // short数组,7*2=14字节,short对齐数通常为2
	int i;      // int类型,大小4字节,对齐数为4
};
  • int i 的对齐数为4,大于 short 的2,故最大对齐数为4。
  • 最大成员大小为 short c[7] 的 14 字节。
  • 14 不是 4 的倍数,需向上对齐至16。因此 sizeof(union Un2) = 16 字节。

总结

本文系统地介绍了 C 语言联合体的定义、内存共享特性以及对齐规则,并通过具体代码演示了其在字节序判断中的应用。理解联合体有助于更高效地进行底层内存操作。

以上就是C语言联合体Union特点及运用全面讲解教程的详细内容,更多关于C语言联合体Union教程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。