c语言学习笔记之结构体存储
今天讲讲结构体存储问题
首先,结构体简单说是对不同类型的封装,一开始我们可能会想结构体在内存中的存储的大小是直接元素的和
例如

我们可能会觉得是 结构体大小=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语言学习笔记之结构体存储的更多相关文章
- C语言学习笔记--枚举&结构体
枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...
- C语言学习笔记10-结构体、枚举、联合体
C语言学习笔记10-结构体.枚举.联合体 待传
- C#学习笔记之结构体
1.概述 结构是一种与类相似的数据类型,不过它较类更为轻量,一般适用于表示类似Point.Rectangle.Color的对象.基本上结构能办到的类全都能办到,但在某些情况下使用结构更为合适,后面会有 ...
- 《PHP7底层设计与源码实现》学习笔记2——结构体对齐
书里给了一段代码,假如有个结构体如下: struct test { char a; int b; long c; void* d; int e; cha ...
- contiki学习笔记---process结构体
process,字面意义,进程,看看它的结构 struct process { struct process *next; #if PROCESS_CONF_NO_PROCESS_NAMES #def ...
- 【C#学习笔记】结构体使用
using System; namespace ConsoleApplication { struct _st { public string name; public int age; } clas ...
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- Go学习笔记07-结构体与方法
Go学习笔记07-结构体与方法 Go语言 面向对象 结构的定义与创建 面向对象 Go语言只支持封装,不支持继承和多态. Go语言中只有struct,即结构体:没有class. 结构的定义与创建 pac ...
随机推荐
- shell专题(二):Shell解析器
(1)Linux提供的Shell解析器有: [atguigu@hadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/da ...
- Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数
Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数 内容大纲 1.函数的初识 2.函数的定义 3.函数的调用 4.函数的返回值 5.函数的参数 1.函数初识 # def ...
- Vue中使用websocket
<template> <div class="test">websocket demo</div></template> < ...
- Web Scraping using Python Scrapy_BS4 - Introduction
What is Web Scraping This is also referred to as web harvesting and web data extraction. This is the ...
- 足球动图gif(二)
- 团队转型,Scrum与DevOps要如何取舍?
团队在践行敏捷的过程中,会有多种选择:Scrum.XP.Kanban.Crystal.精益生产.规模化敏捷等,其中最流行的敏捷开发方法当属Scrum.正因如此,大部分人对其产生了刻板印象:认为敏捷就是 ...
- 题解 洛谷 P2046 【[NOI2010]海拔】
首先进行贪心,发现海拔有梯度时一定是不优的,最优的情况是海拔像断崖一样上升,也就是左上角有一片海拔高度为\(0\),右下角有一片海拔高度为\(1\). 发现这样的性质后,不难想到用最小割来解决问题,但 ...
- 印象笔记如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 印象笔记如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载a ...
- python新手70个练手项目
不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自 ...
- text输入框
https://blog.csdn.net/renhong20121314/article/details/51906555