结构体和共用体的内存对齐

本文探讨了编译器如何按成员列表顺序分配内存给结构体,并解释了内存对齐的概念及其对结构体和联合体的影响。文中还讨论了结构体内嵌套结构体的情况以及联合体的对齐方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译器按照成员列表的顺序一个接一个地给每个成员分配内存。

只有当存储成员时需要满足正确的边界对齐要求时,成员时间才可能出现用于填充的额外内存空间。

系统禁止编译器在一个结构的起始位置跳过几个字节来满足边界对齐要求,因此所有结构的起始位置必须是结构中边界要求最严格的数据所要求的位置。

这段话来自 C和指针,意思是存储结构体变量的地址必须是结构体最长元素的整数倍。

结构体嵌套结构体时的内存对齐还是以最长元素作为边界对齐要求,而不是以结构体变量的长度:

可以发现,结构变量的首地址是4的整数倍,而不是的整数倍。

 

联合体的对齐方式和结构体一样

联合体的长度是最长成员的长度

如果联合体的成员是数组并且数组的长度是联合体中是最长的,那么联合体的长度是数组的长度,而不是单个数组元素的长度;联合体的成员是结构体变量并且结构体的长度是联合体中是最长的,那么联合体的长度是结构体变量的长度而不是结构体成员变量的长度。

长度12

结构体变量的长度为12个字节,在联合体成员中是最长的,所以联合体的大小12个字节。按照4对齐(int型)

### C语言结构体共用体的学习资源 以下是关于C语言中的结构体共用体的概念及其应用的详细介绍,以及如何通过思维导图来辅助学习。 #### 一、结构体的核心知识点 结构体是一种用户自定义的数据类型,允许将不同类型的数据组合在一起形成一个新的数据单元。它广泛应用于复杂数据建模场景中[^1]。 - **结构体的声明与变量定义** ```c struct Point { int x; int y; }; struct Point p = {1, 2}; ``` - **结构体初始化** 可以在定义时直接赋初值,也可以后续单独赋值。 ```c struct Point p = {3, 4}; // 初始化方式 p.x = 5; // 单独赋值 ``` - **内存对齐** 编译器为了提高访问效率会对成员按一定规则排列,这可能导致实际占用空间大于理论所需。 - 对齐原则通常取决于最大基本类型的大小或编译选项设置[^1]。 - **传递参数给函数** 结构体可以通过值或者指针形式作为参数传入函数,其中后者更高效因为避免了拷贝操作。 ```c void modifyPoint(struct Point *p) { (*p).x += 10; } ``` - **实现位段** 使用位字段可以节省存储空间并控制特定硬件寄存器等低级细节,但需注意不同平台上的填充差异影响可移植性。 ```c struct Flags { unsigned int is_active : 1; unsigned int reserved : 7; } flags; ``` #### 二、共用体的关键特性 共用体允许多个不同的数据类型共享同一块内存区域,主要用于处理多种可能互斥的数据表示情况下的优化需求。 - **定义与特点** 所有成员都从同一个地址开始分配;任何时刻只有一个成员含有有效值。 ```c union Data { int i; float f; char str[20]; }; union Data data; data.i = 10; printf("%d\n", data.i); /* 输出整数 */ data.f = 22.5f; printf("%.2f\n", data.f);/* 输出浮点数 */ strcpy(data.str,"Hello"); printf("%s\n",data.str);/* 字符串覆盖前面两个数值*/ ``` - **大小计算** 共用体型的最大尺寸等于其内部最大的单一元素所占字节数量加上必要的边界调整。 #### 三、推荐学习方法——构建思维导图 对于理解记忆这些抽象概念来说,制作一张清晰直观的思维导图非常有益: 1. 中心主题设定为"C语言复合数据类型" 2. 主分支分别指向"Structure(结构)" "Union(共用)" 3. 下一层细化各个子项如前所述的具体方面内容 #### 四、总结 掌握好结构体共用体会极大增强编程能力特别是当面对现实世界问题解决时能够灵活运用它们设计合理的解决方案。 ```python # 示例Python代码仅作对比展示用途而非本文讨论重点 class Person: def __init__(self,name,age): self.name=name self.age=age person_instance=Person('Alice',28) print(f'{person_instance.name} is {person_instance.age}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值