无嵌套结构体的大小计算

如何计算结构体的大小?

由于存储变量地址对齐的问题,计算结构体大小的3条规则:
1、结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。(对齐)
2、结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节的整数倍。(对齐)
3、结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数”的整数倍(补齐)

计算下面结构体的大小

struct Test1
{int b;double c;    long d;
}Test1;
int main()
{printf("size = %d\n", sizeof(Test1));return 0;
}


计算流程:当计算结构体大小时,为了方便计算,初始地址假设为0,int占了4个字节,总开辟的空间为4,因为要和下面的double类型对齐,double的起始地址必须为8,所以绿色部分为因对齐而另开辟的空间,double占了8个字节,所以现在总开辟的是16个字节,long的字 节为4, 16是4的倍数,所以long的起始地址为16,long占了4个字节,此时共开辟了20个字节大小的空间。因为最后面没有类型了,结构体变量的总大小要根据结构体变量中最大基本数据类型对齐,20要跟8对齐,但是20不是8的整数倍,所以在long的后面再开辟4个字节,所以最后一共开辟了24个字节。

程序运行结果

计算含有数组的结构体大小

计算含有数组的结构体大小时,需要注意的是,如果下一个成员是数组,则不需要偏移,只要连续开辟空间。
计算下面结构体的大小

typedef struct Test2
{char c[10];char ca[5];int a;}Test2;int main()
{printf("size = %d\n", sizeof(Test2));return 0;
}

计算流程:起始地址为0,char c[9]占了9个字节的空间,因为下一个成员也是数组,所以不用对齐,直接在地址9这里开辟一个数组char ca[5],占了5个字节,此时是占了14个字节,但是下一个成员是int类型,14不是4的整数倍,所以要从16地址开始存放int a,int占了4个字节,所以总开辟了20个字节,随后,结构体的总大小必须是结构体里最大基本类型的整数倍,这里为int 4个字节,20是4的整数倍,不用补齐,所以此结构体最总开辟了20个字节。

程序运行结果

计算嵌套结构体的大小

计算下面结构体的大小

typedef struct Test3
{short a;struct{int b; double c;long d;};int e;
}Test2;int main()
{printf("size = %d\n", sizeof(Test3));return 0;
}

计算流程:起始地址位置为0,short类型占了2个字节,下面的一个成员类型为结构体,此时要与嵌套的结构体里最大的基本类型,也就是和double 8字节对齐,所以另开辟空间6个,此时地址8是8的倍数,可以存放结构体,这里计算里面的结构体的大小为24,所以8+24=32,所以此时一共占了32个字节空间的大小,最后一个int类型,32是4的整数倍,所以int就直接存在结构体类型的后面,32+4=36,最后要和结构体最大的基本数据类型补齐,里面的结构体的类型也算。所以要与double 8补齐,36不是8的倍数,随后另开辟4个字节空间。所以最后结构体的总大小为40.

程序运行结果

如有疑问或者其它更好的方法,可以在下面评论区留言

C语言 如何计算结构体的大小相关推荐

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

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

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

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

  3. C语言 计算结构体大小

    本文主要参考:结构体内存对齐(如何计算结构体的大小) 前言 数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数. 结构体中的成员可以是不同的数据类型, ...

  4. C语言之结构体(进阶篇)

    目录 1.结构体的内存对齐​ 如何计算呢?​ 掌握结构体的对齐规则: 为什么存在内存对齐呢?​ ​​​​​​​offsetof​ 位段​ 什么是位段?​ 比如: 位段的内存分配​ 举个例子 位段的跨平 ...

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

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

  6. C语言中如何计算结构体的字节大小

    结构体内存对齐 在计算结构体所占字节的大小时,不要直观地累加结构体内成员的字节大小,实际结构体存放在内存中是有一定的规则的,这里涉及的规则就是内存对齐原则. 声明一个结构体stu struct stu ...

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

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

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

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

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

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

最新文章

  1. 系统架构设计师证书含金量_计算机专科生不能错过的两个证书,含金量比较高,出社会有益...
  2. 傅里叶变换 【完整版】
  3. android 技术等级
  4. Spark深入浅出企业级最佳实践
  5. [Android] 混音线程MixerThread
  6. wⅰndows办公软件2003,办公软件2003
  7. 计算机二级修改并应用基本简历模板,2020年新版个人简历模板大全可编辑(word版).docx...
  8. 解决Tomcat中文乱码
  9. Android shape半圆,1/4圆
  10. 超详细的Mac重装系统教程!让重装系统变得简单起来!
  11. 配对t检验的应用条件是什么_配对t检验在实际工作中的应用
  12. PS之立体台球制作步骤
  13. DevOps之自动化测试
  14. WebRTC系列-音频ADM播放采集的停止与开始
  15. DSPE-PEG-MMPs; PEG-MMPs-DSPE ;聚乙二醇-基质金属蛋白酶-磷脂 ;磷脂-聚乙二醇-基质金属蛋白酶
  16. 全球最火的程序员学习路线!java私塾初级模拟银源代码
  17. 仓央嘉措经典语句分享
  18. Android怎么自定义充电铃声,安卓手机怎么自定义充电提示音_自定义安卓充电提示音教程_3DM手游...
  19. Android开发 之 LinearGradient与闪动文字效果
  20. 6轴并联机器人开发--进展

热门文章

  1. c++ 原子操作 赋值_多线程操作可见性
  2. visual studio 判断dropdownlist选的是什么_测试:选一顶你觉得最漂亮的皇冠。测你长了张什么脸?我是发财脸...
  3. java 解析标记语言_Java XML可扩展标记语言(eXtensible Markup Language)
  4. java plus方法_Java MyBatis-Plus 基本使用
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的学校教务查询系统
  6. html音频自动播放隐藏控制器,HTML5 音频回放/播放控制器
  7. kubernetes系列11—PV和PVC详解
  8. js 获取相同name元素的属性值
  9. WebRTC 学习之 WebRTC 简介
  10. init.d目录理解