当前位置: 首页 > article >正文

结构体对齐和补齐

结构体的对齐和补齐的规则:
对齐:假定从零地址开始,每成员的起始地址编号,必须是它本身字节数的整数倍。
补齐:结构的总字节数必须是它最大成员的整数倍。
注意:在Linux系统下计算补齐、对齐时,成员超过4字节按4字节计算。

#include <stdio.h>
#pragma pack(4)//编译器按照4字节对齐 
typedef struct data
{
	char a[11];
	int b;
	char c;
	double d;
	short e;
}data;

int main()
{
	int size = sizeof(data);
	printf("%d\n",size);
	//计算出40字节是因为系统是64位的,默认8字节对齐 
	//默认4字节对齐,结果是32 
	return 0;
}

1、首先第一个成员 char a[11],char类型是占一个字节的,所以第一个成员结束的地址范围是0~10,占了11个字节。 注意:地址的范围是假定从0开始的。

2、然后是第二个成员int b,int类型是占了4个字节的,然后第二个成员的起始地址是11,然后我们发现11不是4的倍数,所以这个时候我们要考虑对齐规则,即让起始地址是4的倍数,所以这里int b的起始地址是12,地址范围是12~15占了4个字节。

3、接着看第三个成员char c,因为char是占了一个字节,所以不需要考虑补齐和对齐,所以第三个成员占的地址是16,就一个字节。

4、再来看第四个成员double d,首先这里要注意一点在Linux系统下计算补齐、对齐时,成员超过4字节按4字节计算,这里我们默认是Linux系统下,当然在一般在别的系统下也有这个规则。然后这里的起始地址是17,不是4的倍数,所以我们要考虑对齐规则,即让double d的起始地址变成20,然后这里还要注意一点,double是4字节只是在对齐的时候需要考虑,在计算大小是还是要改成原来的8字节,所以第四个成员占的地址范围是20~27,占了8个字节。

5、最后再看第五个成员short e,short是占了2个字节的。起始地址是28,发现是2的倍数,所以不用再对齐了,所以占的地址范围是28~29,占了两个字节。

最后这个结构体的地址范围是0~29,大小是30个字节,但是我们在计算结构体大小的时候还有一条规则,就是补齐。在这个结构中最大的成员的字节数是4(超过4字节按4字节算),30不是4的整数倍,所以最后这个结构体的大小还要增加2,最后的结果就是32。

本文是复制大佬的文章。
原文链接:https://blog.csdn.net/weixin_45372436/article/details/99630449


http://www.kler.cn/news/161466.html

相关文章:

  • HarmonyOS开发(十):通知和提醒
  • 洛谷P1044 [NOIP2003 普及组] 栈 递归方法
  • JVM中 Minor GC 和 Full GC 的区别
  • React中的空标签与Fragment标签的区别
  • 【数据库设计和SQL基础语法】--表的创建与操作--插入、更新和删除数据
  • Nginx(配置SLL证书)
  • 重生奇迹mu武器镶嵌顺序
  • MySQL学习day05
  • C++ STL容器与常用库函数
  • 一则广告,一个故事,这就我选择学习计算机专业的两个原因
  • 中国证券交易所有哪些
  • vs2022 winform 使用LiveCharts.Wpf控件出现黑框 去除方法
  • zabbix分布式监控平台从IPV4切换到IPV6之监控主机切换
  • 【LeeCode】1.两数之和
  • webpack配置scss loader
  • 【数据库】基于时间戳的并发访问控制,乐观模式,时间戳替代形式及存在的问题,与封锁模式的对比
  • 单片机学习13——串口通信
  • 在 Windows 桌面的redis中远程连接到 VMware 中运行的 Linux 上的 Redis
  • simulinkDFIG风电场风机并网渗透率系统稳定性小信号特征值分析,特征根轨迹分析。四机两区域模型系统
  • 基于B/S架构的医院一体化电子病历编辑器源码
  • Docker的数据卷
  • 使用ApexSQLLog工具恢复数据库
  • 【C语言快速学习基础篇】之一基础类型、进制转换、数据位宽
  • uni-app 微信小程序之好看的ui登录页面(二)
  • idea报错:Error:java: 不允许在使用 -release 时从系统模块 java.xml 导出程序包?
  • 数据收集与处理(爬虫技术)
  • 【QML】QML与cpp交互(一)—— QML直接调用cpp函数
  • 蛋白质序列总特征提取流程
  • 黛姿秘语,匠心之作,严谨工艺铸就完美肌肤
  • 测试新手百科:Postman简介、安装、入门使用方法详细攻略!