今天讲讲结构体存储问题

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

例如

我们可能会觉得是 结构体大小=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. It's time for Django

    本节内容 Django流程介绍 Django url Django view Django models Django template Django form Django admin Django ...

  2. Unity-Editor

    Undo.RecordObject [MenuItem("Example/Random Rotate")] static void RandomRotate() { var tra ...

  3. 访问控制列表与SSH结合使用,为网络设备保驾护航,提高安全性

    通过之前的文章简单介绍了华为交换机如何配置SSH远程登录,在一些工作场景,需要特定的IP地址段能够SSH远程访问和管理网络设备,这样又需要怎么配置呢?下面通过一个简单的案例带着大家去了解一下. 要实现 ...

  4. 图解java方法的简单执行步骤

    图解java方法的简单执行步骤 1,找到该方法 2  传入对应的参数 3 执行方法体 4 返回结果

  5. Ethical Hacking - Web Penetration Testing(5)

    LOCAL FILE INCLUSION Allows an attacker to read ANY file on the same server. Access files outside ww ...

  6. Ethical Hacking - NETWORK PENETRATION TESTING(20)

    MITM - Capturing Screen Of Target & Injecting a Keylogger ScreenShotter Plugin: ScreenShotter: U ...

  7. 【JVM之内存与垃圾回收篇】类加载子系统

    类加载子系统 概述 完整图如下: 如果自己想手写一个 Java 虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件, ...

  8. Java中Map的entrySet()详解

    转发:原博客 由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系.Map中采用Entry内部类来表示一个映射项,映射项包含Key和ValueMap.Entry里面包含getKey() ...

  9. Linux内存大页设置

    实际环境中,遇到3次由于内存大页设置参数不合理或者错误,导致系统内存不足,或者数据库内存不足的问题. 按照如下方式,推荐设置大页参考下发设置! 参考HugePages on Oracle Linux ...

  10. Python API 操作Hadoop hdfs详解

    1:安装 由于是windows环境(linux其实也一样),只要有pip或者setup_install安装起来都是很方便的 >pip install hdfs 2:Client——创建集群连接 ...