今天讲讲结构体存储问题

首先,结构体简单说是对不同类型的封装,一开始我们可能会想结构体在内存中的存储的大小是直接元素的和

例如

我们可能会觉得是 结构体大小=int(4个字节)+ short(2个字节)+char(1个字节) = 7个字节

其实这样想是错误的

结构体的存储默认是向元素里最大的数据类型对齐的

上面的话是什么意思呢,还是以上个例子为例,

也就是这个结构体中,以int(4个字节)对齐,也可以理解做就是一行有int(4个字节)那么大

假如一个小格子为一个字节,先把int放入内存中,也就是占了4个字节

然后放入short(2个字节)

最后是char(1个字节)

这样我们就把所有的元素都放进去了,然后因为是以最大字节对齐

所以在内存为了要放下这三个元素,是不是开辟了两个int(4个字节)也就是两行4个字节才能装得下这些元素

所以最终这个结构体struct的内存 = 4+4 = 8(字节)

我们用程序判断一下

结果和我们计算的一样

那如果我们把两个元素调换一下呢,结果还会一样吗,这次我们先用程序验证一下

咦,结果为12字节,这是为什么呢?

这次我们还是画图了解一下

与上次不一样,这次我们得先放short(2个字节)

接着放int(4个字节)

有人可能会觉得是一下的排放方法,把一个int(4个字节)分做两半,一半放下面两个空格,一般放上面两格,再放char(1个字节),如下图

可是,如果是这样的话,那结构体所占的大小也是应该和上面例子一样8字节,怎么会是12字节呢,问题究竟出在哪?

问题其实出在了我们把int分做两半了,我们可以这样想,int是个整体,我们能把它拆分吗,就好比一个人,让他一半来这里,

另一半去那边,明显是不能的嘛,一个人是个单独的整体,int也是一样,所以正确做法是在建一行存放int

那重新从第二部开始,把一个int(4个字节)放入

再放char(1个字节)

所以最终这个结构体struct的内存 = 4+4+4= 12(字节)

如果想要实现我们一开始想法的4+2+1 = 7(字节),我们得加入

附上各个数据类型所占字节数,大家可以随意搭配试试结构体的内存所占大小,练习一下

c语言学习笔记之结构体存储的更多相关文章

  1. C语言学习笔记--枚举&结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  2. C语言学习笔记10-结构体、枚举、联合体

    C语言学习笔记10-结构体.枚举.联合体    待传

  3. C#学习笔记之结构体

    1.概述 结构是一种与类相似的数据类型,不过它较类更为轻量,一般适用于表示类似Point.Rectangle.Color的对象.基本上结构能办到的类全都能办到,但在某些情况下使用结构更为合适,后面会有 ...

  4. 《PHP7底层设计与源码实现》学习笔记2——结构体对齐

    书里给了一段代码,假如有个结构体如下: struct test {     char a;     int b;     long c;     void* d;     int e;     cha ...

  5. contiki学习笔记---process结构体

    process,字面意义,进程,看看它的结构 struct process { struct process *next; #if PROCESS_CONF_NO_PROCESS_NAMES #def ...

  6. 【C#学习笔记】结构体使用

    using System; namespace ConsoleApplication { struct _st { public string name; public int age; } clas ...

  7. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

  8. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  9. Go学习笔记07-结构体与方法

    Go学习笔记07-结构体与方法 Go语言 面向对象 结构的定义与创建 面向对象 Go语言只支持封装,不支持继承和多态. Go语言中只有struct,即结构体:没有class. 结构的定义与创建 pac ...

随机推荐

  1. Scala 面向对象(二):package 包 (一) 入门

    1 Scala包的基本介绍 和Java一样,Scala中管理项目可以使用包,但Scala中的包的功能更加强大,使用也相对复杂些,下面我们学习Scala包的使用和注意事项. 2 Scala包快速入门 使 ...

  2. java 面向对象(二十四):interface:接口

    interface:接口1.使用说明: 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * * 3.1 JDK7及以前:只能 ...

  3. python 装饰器(七):装饰器实例(四)类装饰器装饰类以及类方法

    类装饰器装饰类方法 不带参数 from functools import wraps import types class CatchException: def __init__(self,orig ...

  4. Python模块01/自定义模块/time模块/datetime模块/random模块

    Python模块01/自定义模块/time模块/datetime模块/random模块 内容大纲 1.自定义模块 2.time模块 3.datetime模块 4.random模块 1.自定义模块 1. ...

  5. 用前端姿势玩docker【三】基于nvm的前端环境构建技巧

    前言 安装docker啥的就不说了,这里重点强调一下,docker的环境问题.本人的环境: 虚拟机centos => docker => NAT => container 因为需要不 ...

  6. 太实用了!自己动手写软件——GUI编程

    这几天我有一个想法就是将我之前做测试写的一些协议脚本(如:ssh.FTP.SMTP.MySQL.Oracle等)综合在一起做一个密码PJ器,这么多的协议放在一起,每个协议都有自己特殊的参数,如果还是和 ...

  7. scratch编程我的世界3D史蒂夫

    这个程序我们只能制作出一个3D模型而已,并不是真正的我的世界整个游戏: 效果很炫酷吧!现在我们就来看看是怎样编程的吧! 首先,这个模型是有无数个平面克隆体摞在一起,旋转后会产生一种立体的错觉,是不是有 ...

  8. 记一次公司JVM堆溢出抽丝剥茧定位的过程

    背景 公司线上有个tomcat服务,里面合并部署了大概8个微服务,之所以没有像其他微服务那样单独部署,其目的是为了节约服务器资源,况且这8个服务是属于边缘服务,并发不高,就算宕机也不会影响核心业务. ...

  9. java8中parallelStream提升数倍查询效率是怎样实现的,来看看这篇文章

    作者:我恰芙蓉王 原文:https://www.cnblogs.com/-tang/p/13283216.html 业务场景 在很多项目中,都有类似数据汇总的业务场景,查询今日注册会员数,在线会员数, ...

  10. Nginx配置多个域名指向不同的端口

    一.前言 很多时候我们都会在同一个服务器上部署多个项目,我们有多个域名的情况下,怎么样使不同的域名都通过80端口来访问呢?打个比方说,现在有2个域名,分别是:tessai.cn 和 admin.tes ...