C语言 结构体字节对齐问题
2024-08-28 22:16:43
方法一:
结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。
原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
原则2 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
原则3 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
方法二:
struct的内存大小为每个数据内存的加和,首先按照最大的数据类型进行单个分配,如果前一个数据占用不了所有的内存,而剩下的内存可以放下下一个数据,则第二个数据不另外分配内存(但是地址必须是从这个数据类型大小的整数倍开始,看下面的struct C),否则重新分配一个最大类型的内存。
例题
链接:https://www.nowcoder.com/questionTerminal/8e8b73ee8f3a402ba47876f8e0b2b62d
来源:牛客网
在64位系统下,地址占64位
,即指针占64位,8个字节。
所以,*p所占的内存是这要的:
a【0-7】:本身占1个字节,因原则1,d起始位置需要是8的倍数,于是字节对齐占7个字节,共8个字节
d【8-15】:64位指针,占8字节
b【16-19】:占32位,4个字节
c:16 【20-23】:占16位,2个字节,因原则1,e起始位置需要是8的倍数,于是字节对齐占2个字节,共4个字节
e【24-32】:64位,8个字节
8 + 8 + 4 + 4 + 8 = 32
最新文章
- php js =>; splice 数组 插入 功能
- PHP学习第一天笔记——php的基本语法
- __proto__与prototype
- Java中检测字符串的编码格式
- Skrollr.js -- 使用Skrollr创建视差滚动效果页面
- (转)Tomcat的目录结构
- Android实例-监测网络状态及一些事件(XE8+小米2)
- TatukGIS-TGIS_ShapeArc.GetPointOnLine
- 2015 8月之后";云计算";学习计划
- python多线程实现售票
- PHP--高级算法--面试
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十九):服务消费(Ribbon、Feign)
- NOIP 2006 作业调度方案
- hdu 2444(二分图) The Accomodation of Students
- UIWebView加载CSS样式的html
- 〖Linux〗Ubuntu设定Proxy及忽略Proxy
- How Not to Crash #2: Mutation Exceptions 可变异常(不要枚举可变的集合)
- 如何在Eclipse中查看JDK以及Java框架的源码
- Android四大组件之Intent(续2)
- Codeforces Round #362(Div1) D Legen...(AC自动机+矩阵快速幂)