看到个写得比较好的博文,转给大家看看

格式一:  

1

2

3

4

5

6

01.struct tagPhone

02.{

03.     char   A;

04.     int    B;

05.     short  C;

06.}Phone;

  格式二:

1

2

3

4

5

6

01.struct tagPhone

02.{

03.     char   A;

04.     short  C;

05.     int    B;

06.}Phone2;

  格式三:

1

2

3

4

5

6

01.struct tagPhone3

02.{

03.     char   A;

04.     char   B[2];

05.     char   C[4];

06.}Phone3;

我们都知道,char类型占用1个字节,int型占用4个字节,short类型占用2个字节,long占用8个,double占用16个;

  那么我们可能会犯一个错误就是直接1+4+2=7,该结构体占用7个字节。这是错的。

以下我们简单分析下:

  计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小。

  对格式一:

  

  

  以int型占用4个来作为倍数,因为A占用一个字节后,B放不下,所以开辟新的单元,然后开辟新的单元放C,所以格式一占用的字节数为:3*4=12;

  同理对于格式二,

  

  A后面还有三个字节,足够C存放,所以C根着A后面存放,然后开辟新单元存放B数据。所以格式二占用的内存字节为2*4=8.

  

  对于格式三:

  

  上面结构计算大小,sizeof(Phone3) = 1 + 2 + 4 = 7, 其大小为结构体中个字段大小之和,这也是最节省空间的一种写法。

  

  总结:

  第一种写法,空间浪费严重,sizeof 计算大小与预期不一致,但是保持了每个字段的数据类型。这也是最常见的漫不经心的写法,一般人很容易这样写;

  第三种写法,最节省空间的写法,也是使用 sizeof 求大小与预期一样的写法,但是全部使用字节类型,丢失了字段本生的数据类型,不方便使用;

第二种写法,介于第一种和第三种写法之间,其空间上比较紧凑,7a686964616fe58685e5aeb931333337616465同时又保持了结构体中字段的数据类型。

  只要了解是这些写法的差异性,可以视情况选用。

C语言结构体所占用的字节数如何计算相关推荐

  1. c语言结构体struct所占字节数求解

    原本觉的c语言学的还不错,今天看了一下c语言的有关书籍,看到求结构体大小的例子,心想这不是很简单吗,不就是把所有成员的大小加起来就行了,其实远没我想的简单,看来c语言还要继续学习哈哈. 先看一个实例 ...

  2. 关于C语言中的结构体所占的字节数 sizeof(struct)

    C语言中的结构体所占的字节数 ,用sizeof求一个结构体的大小 C语言中用sizeof求结构体所占字节数的详细方法. 一.非嵌套结构体 struct one{char a; // 1(char所占字 ...

  3. c语言结构体变量所占字节计算,【C语言】结构体占用字节数及存储与空间分配...

    我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等. 在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取 ...

  4. c语言常用数据类型所占用的字节数

    一.数据类型所占用字节数与机器字长与编译器有关,遵循的几条规律如下: sizeof(short int )<=sizeof(int) sizeof(int)<=sizeof(long in ...

  5. C语言结构体变量和结构体数组-学习笔记(十六)

    一.结构体变量 1.结构体概念 将不同类型的数据组合成一个有机的整体即为结构体.结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型. 2.结构体类型及结构体变量定义 (1)结构体类型声明 ...

  6. C语言结构体占用内存总结

    C语言结构体占用内存总结 前几天有个小朋友问了我一下,关于C语言结构体占用空间的问题.觉得以后会对小可爱有点帮助,就打算先写一下. struct Test {int a;char b;int c; } ...

  7. C语言结构体字节对齐

      默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在我们不 ...

  8. C语言结构体字节对齐规则

    C语言结构体字节对齐规则 基本规则 规则1 :结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在 ...

  9. ARM汇编语言实现peek()_ARM汇编之访问C语言结构体数据

    前言 本文的写作目的在于装逼,没有要产生实际价值的意思. 前几天在做编译器的项目,有一个项目团队成员一直在问我ARM汇编能不能读C语言的结构体.我心想,我这生成ARM汇编的代码是用C++写的呀,又不是 ...

  10. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

    来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...

最新文章

  1. Apache POI和EasyExcel 第二集:Apache POI的基本Excel写入(分为03版的xls和07版的xlsx)
  2. java高级----Java动态代理的原理
  3. 【图像分类】没有人工收银,吃饭买单全自动化,是谁的功劳?
  4. 81. 搜索旋转排序数组 II---Leecode----java
  5. linux安装mysql启动失败的原因_爱在linux系统安装mysql启动失败如何处理?
  6. 实战OO设计——类的关系:依赖、关联、聚合和组合
  7. 【UNITY3D 游戏开发之三】NGUI HUDTEXT 的练习源码及资源
  8. 数据链路层的差错控制ARQ
  9. mvn compile遇到的问题:-source1.3 中不支持注释
  10. 凯利KAC交流控制器调试方案
  11. LeapFTP3.1注册码
  12. docsify操作和Docker部署流程文档
  13. 偏序集、偏序关系和格
  14. 成年人的世界,不过如此
  15. Pandorabox(Openwrt) 双宽带(WAN) 叠加网络实战
  16. linux mysql 开发环境_RedHat Linux下QT平台MySQL数据库开发环境配置
  17. 靶机16 GROTESQUE: 2
  18. 搜狗输入法 linux 17.04,Ubuntu17.04 安装搜狗中文输入法的方法
  19. openstack是啥子
  20. python爬虫入门—selenuim自动登录qq邮箱

热门文章

  1. linux清理硬盘工具,linux磁盘清理方法 Linux 下垃圾清理工具 BleachBit
  2. Keil C51详细安装教程(最新版)
  3. 树莓派python通过websockets使用调用Leapmtion
  4. 在线qq客服的html代码生成器,js生成qq客服在线代码
  5. 仿秒秒测日历页面和部分功能
  6. android rtsp传输,android-ndk – 使用FFMpeg在Android客户端上进行RTSP流式传输
  7. 基本的 DBus 偵錯技巧
  8. matlab直方图均衡化实现
  9. Hortonworks的开源框架SHC的使用(一)
  10. 软件工程知识点总结——第一、二部分