1. 第一个成员在与结构体变量偏移量为 0 的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的 较小值

VS 中默认的值为 8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

详解请看图
struct S1
{char c1;int i;char c2;
};

拿上图结构体举例,我们可以画图表示

 第一个成员在与结构体变量偏移量为0的地址处。

可以画一个内存,标号从0开始。

 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

例如结构体S1中的char c1,char类型占1个字节,所以占用标号为0的地址处。

再来看第二个成员int,整型占4个字节,而且要对其到对齐数的整数倍的地址处 。

对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值

在vs环境下 默认对齐数为8,而整型为4,所以要对齐到4的倍数地址处,即:

再看第三个成员,又是char类型,而下一地址处的标号为8,就是1的倍数,所以char c2就占标号为8的地址处。

当所有成员占完后, 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

该结构体的最大对齐数为4,当前结构体占了9个字节,不是4的倍数,所以继续往下占用内存空间,直到总大小是4的倍数。

到此为止,该结构体的总大小就知道了,是12。

struct S2
{char c1;char c2;int i;
};

根据上述方法,可知该结构体的大小为8。

故得出结论,结构体的大小还和成员顺序有关。

struct S3
{char c1;struct S2 s2;double d;
};

当遇到结构体里嵌套结构体时

如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

意思就是说,结构体成员里有结构体时,嵌套的结构体的对齐数是该结构体成员里最大的对齐数。struct s2的大小为8,struct s2的成员里,最大对齐数是整型,即4。

所以计算struct s3时,方法不变,依然先是画出一块内存,标号从0开始,其次开始对齐各成员,故如图所示

目前该结构体共占24个字节,最大对齐数是8,24是8的倍数,故该结构体的大小为24。

以上就是如何计算结构体大小的方法,如有不足之处请各位大佬批评指正,欢迎交流!!

结构体的大小该如何计算?相关推荐

  1. C语言 如何计算结构体的大小

    无嵌套结构体的大小计算 如何计算结构体的大小? 由于存储变量地址对齐的问题,计算结构体大小的3条规则: 1.结构体变量的首地址,必须是结构体变量中的"最大基本数据类型成员所占字节数" ...

  2. 详细解释如何计算一个结构体的大小?

    其他: 1.数组下标可为负:a[-1]  相当于  a+(-1); 2.联合体大小就是成员中最大类型的大小: 如何计算一个结构体的大小? 例如: struct Test{ int Num; char ...

  3. 结构体的大小如何计算?

    看了一些博客上关于结构体计算的讲法,有些没讲全面,有些根本就是错误的,可能作者本人都没意识到自己错了,我总结一下加深印象. 查看全文 http://www.taodudu.cc/news/show-7 ...

  4. 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则

    要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...

  5. 结构体的大小如何计算

    我们实际生活中,保存的数据一般不会是同一种类型,所以引入了结构体.而结构体的大小也不是成员类型大小的简单相加.需要考虑到系统在存储结构体变量时的地址对齐问题. 由于存储变量地址对齐的问题,结构体大小计 ...

  6. 如何计算结构体的大小(四步轻松解决)

    我们都知道,利用sizeof可以直接计算得出,那么具体是如何得出这些答案的呢,我将通过代码和四步规则法结合来做演示,如下述代码所示: #include<stdio.h> typedef s ...

  7. C语言sizeof求结构体的大小

    运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4.基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小. ...

  8. 结构体PLUS(计算结构体类型大小及位段)~~

    如何计算结构体类型大小呢? 1. 结构体内存对齐 为什么要内存对齐呢? 2.修改默认对齐数 3.位段 什么是位段 位段的内存分配 位段的跨平台问题 位段的应用 关于结构体类型,之前阿涛写过一篇文章,里 ...

  9. sizeof()计算结构体的大小

    原文链接:sizeof()计算结构体的大小_海月汐辰-CSDN博客_结构体的sizeof怎么计算 简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大 ...

最新文章

  1. Android 监听多个Spinner 的点击事件
  2. 联想618首战告捷,是战略潜力的释放还是最后的“狂欢”?
  3. Warning: Link to vtkInteractionStyle for default style selection的解决办法
  4. c语言dynamic变量,C# dynamic关键字的使用方法
  5. CodeSmith--SchemaExplorer类结构详细介绍
  6. docker运行jenkins挂掉_【图文】Jenkins教程集成SonarQube
  7. C语言 数组遍历 - C语言零基础入门教程
  8. 由已有数组创建新数组:concat()splice()方法
  9. so文件动态加载注意事项
  10. 浅析局域网与广域网中数据传输
  11. HDU 5348 MZL's endless loop(DFS去奇数度点+欧拉回路)
  12. java text to speech_java - 无法使用“ TextToSpeech.speak()”方法 - 堆栈内存溢出
  13. django models 数据库 update_or_create 更新或者插入
  14. 你连阶级固化的原因都搞不清,又凭什么不被固化在底层?
  15. 程序员必看:7个接外包私活网站
  16. 使用 maven 打包 src/test/java下的文件,并用 java jar 跑打包出来的jar
  17. fatal: Couldn't find remote ref refs/heads/cm-13.0
  18. python中forward的参数_ip_forward参数对Linux内核转发影响分析
  19. 名帖337 张旭 草书《古诗四帖》
  20. “第一股”争夺战:每日优鲜、叮咚买菜及美菜网谁能杀出重围?

热门文章

  1. 好程序员Python培训分享Python系列之分支结构
  2. 利用计算机解决问题的原理方法是什么,2021安徽省中小学教师招聘中学信息技术笔试大纲...
  3. 表格属性cellspacing、cellpadding
  4. .NET图表控件TeeChart for .NET使用教程:图例设计
  5. BigPipe facebook
  6. 寻找输入数字中的全数字
  7. 解决Google Chrome 网页加载速度变慢
  8. chatGPT流式回复是怎么实现的
  9. 浅谈 MySQL 新的身份验证插件 caching_sha2_password
  10. 北美“居家令”一再延期,回国机票天价难求,今年我该何去何从?