深入理解C语言共用体/联合体(union):大小计算与大小端判断实战

在C语言中,共用体还有一种称呼是联合体(union)是一种特殊的数据结构,其所有成员共享同一块内存空间,这一特性使其在内存优化和底层编程中极具实用价值。本文将通过三组实战代码,拆解共用体的内存大小计算与大小端字节序判断两大核心应用,帮你彻底搞懂共用体的底层逻辑。

一、共用体的内存大小计算:为什么不是成员大小之和?

首先看第一组代码,核心是探究共用体的 sizeof 结果:

union Un

{

char a5; // 字符数组,占5字节

int b; // 整型,占4字节

};

int main()

{

union Un un = { 0 };

printf("%d\n", sizeof(un)); // 输出结果是多少?

return 0;

}

关键结论:

共用体的内存大小遵循两个规则:

  1. 最大成员对齐规则:大小为"最大成员大小"的整数倍(满足内存对齐要求);

  2. 共享内存规则:所有成员共用一块内存,大小不会累加。

这里最大成员是 char a5 (5字节),但内存对齐要求需是 int (4字节)的整数倍,因此最小满足条件的是8字节,最终 sizeof(un) 输出8。

二、大小端字节序:计算机存储数据的"顺序密码"

在讲解第二、三组代码前,先明确大小端的核心概念:

  • 大端字节序:数据的高位字节存低地址,低位字节存高地址(如 0x11223344 , 0x11 存低地址);

  • 小端字节序:数据的低位字节存低地址,高位字节存高地址(如 0x11223344 , 0x44 存低地址)。

日常使用的x86架构CPU多为小端,而嵌入式、网络传输中常涉及大端,因此需要通过代码判断当前环境的字节序。

三、两种大小端判断方案:数组法vs共用体法

方案1:整型+字符指针(数组思想)

int reck() // 1为大端,0为小端

{

int a = 0x11223344; // 4字节整型,二进制高位到低位:11 22 33 44

char* p = (char*)&a; // char*仅访问1字节,指向a的低地址

if (*p == 0x11) // 若低地址存高位0x11 → 大端

return 1;

else // 若低地址存低位0x44 → 小端

return 0;

}

int main()

{

printf("当前是%s端\n", reck() ? "大" : "小");

return 0;

}

方案2:共用体法(利用共享内存特性)

union Un

{

char b; // 1字节,共享int的低地址

int a; // 4字节,覆盖整个共用体内存

};

int reck() // 1为大端,0为小端

{

union Un un;

un.a = 0x11223344; // 给int赋值,覆盖共用体内存

char* p = &un.b; // 指向共用体低地址(即char b的地址)

return (*p == 0x11) ? 1 : 0; // 判断低地址存储的字节

}

int main()

{

printf("当前是%s端\n", reck() ? "大" : "小");

return 0;

}

两种方案对比:

  • 数组法:逻辑直接,无需借助共用体,适合入门理解;

  • 共用体法:更贴合底层内存设计,利用"成员共享内存"特性,代码更简洁,是工业级常用方案。

注意:代码易错点修正

原代码中 if (*p = 0x11) 是赋值操作( = ),而非判断( == ),会导致结果始终为1,实际开发中需务必修正为判断运算符 == !

四、核心总结

  1. 共用体大小 = 最大成员大小的整数倍(内存对齐);

  2. 大小端判断的核心:通过"访问低地址1字节数据",判断其是原数据的高位还是低位;

  3. 共用体是底层编程的"利器",除了大小端判断,还可用于内存复用、硬件寄存器操作等场景。

相关推荐
GGMM7899 小时前
西门子BOP20基本操作面板超详细教程(S120/G130专用)
笔记·变频器·变频器维修
网安蟹佬霸10 小时前
2026网络安全每日学习计划:每天学多久?学什么?怎么安排?照着做就行!
网络·学习·安全·web安全·学习路线·网安
一条破秋裤10 小时前
TIM 输入捕获与 PWMI:从边沿到频率、占空比
笔记·stm32·学习
羚尔10 小时前
C语言数组
c语言·开发语言
知产xiao_xin10 小时前
知识产权入门 —— 工业品外观设计
经验分享·笔记·知识产权
2601_9499506310 小时前
考研英语资料太散?用小程序把真题、词汇和错题放到一起
人工智能·学习·考研·小程序·刷题·小程序推荐
小猪code10 小时前
frp 80/443 Web 服务两种部署模式实操笔记
前端·笔记
熊猫钓鱼>_>11 小时前
鸿蒙AI Agent新范式:从“对话式辅助”到“工程化代理”的Harness架构实战解析
人工智能·笔记·学习·华为·架构·harmonyos
GGMM78911 小时前
西门子 AAOP 亚洲高级操作面板详解(MM420/MM440 专用)
笔记·变频器·变频器维修
GGMM78911 小时前
西门子 IOP 智能操作面板详细使用教程(G120/G120C)
笔记·变频器·变频器维修