C语言--结构体大小

在这里插入图片描述

基本数据类型占用的字节数分别为:char(1),short(2),int(4),long(4),long long(8),float(4),double(8)。
分析一下下面结构体占用的字节数。

struct A
{
int a;
};
struct B
{
char a;
int b;
};
int main()
{
printf("sizeof(struct A)=%d\n", sizeof(struct A));//测试A的大小
printf("sizeof(struct B)=%d\n", sizeof(struct B));//测试B的大小
return 0;
}

在这里插入图片描述
struct A的大小好理解,int a的大小为4字节。
struct B的大小为什么是8字节,而不是1+4,5字节呢?
出于性能考虑,数据应该尽可能地在自然边界上对齐”。这句话是什么意思呢?看下图,假设地址从100
开始
在这里插入图片描述
在上图的(一)中,a,b内存紧密相连,其内存加起来是5个字节,但是b的地址为101不能被4整除(4是b的
类型大小)。读取b的数据时需要转换,速度较慢。
在上图的(二)中,a,b中间有三个字节的空间不使用,b的地址为104能被4整除,读取b的数据时不需要转
换,速度快。但这时的空间为1+3+4=8字节。
现代计算机的内存都是比较大的,操作系统在设计时都愿意浪费一点点空间来换取更快的速度

对齐规则1

对齐规则1:当前成员所在的地址能整除成员本身的字节大小。
也就是说,char类型成员的地址要能被1整除,short类型成员的地址要能被2整除,int类型成员的地址要
能被4整除,其它数据类型同理。
再练习几个,看看它们的大小是几个字节呢?

在这里插入图片描述
答案分别是8,16,12。

在这里插入图片描述
上图中”+”后面的数字为内存对齐不使用的字节数。
下面这个结构体占用几个字节呢

struct E
{
int a;
char b;
};

它的大小应该是5(4+1)字节,但是实际上它的大小却是8字节,这是为什么呢?
规则:

对齐规则2

对齐规则2:==结构体的总大小能整除单个最大成员的字节数。 ==
上面的例子, struct E占用字节数5不能整除最大成员a的字节数4(5不能整除4),所以struct E占用的字
节数应该对齐为4的倍数,8字节。
对齐规则2又是怎么来的呢?为什么有这样的规定?请看下面的分析。

struct E
{
int a;
char b;
};
int main()
{
struct E arr[2]; //结构体数组
return 0;
}

结构体不仅可以定义单个变量,也可以定义数组,如上struct E arr[2];那么arr数组的内存如何分布呢?
在这里插入图片描述
如上图(一)所示,如果struct E占用5字节,数组arr[0]成员a,b的地址都可以被本身大小整除,但是
arr[1]。a的地址为105不能被4整除。
如上图(二)所示,如果struct E占用8节字,那么arr[0],arr[1]的成员地址都可以被本身大小整除。


本篇完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/307274.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BI数据分析软件:行业趋势与功能特点剖析

随着数据量的爆炸性增长,企业对于数据的需求也日益迫切。BI数据分析软件作为帮助企业实现数据驱动决策的关键工具,在当前的商业环境中扮演着不可或缺的角色。本文将从行业趋势、功能特点以及适用场景等方面,深入剖析BI数据分析软件&#xff0…

Docker容器tomcat中文名文件404错误不一定是URIEncoding,有可能是LANG=zh_CN.UTF-8引起

使用Docker部署tomcat,出现中文名文件无法读取,访问就是404错误。在网上搜索一通,都说是在tomcat的配置文件server.xml中修改一下URIEncoding为utf-8就行,但是我怎么测试都不行。最终发现,是Docker启动时,传…

关于Excel中自动填充的功能,看这篇文章就差不多了

序言 这篇文章介绍了Excel的自动填充功能。你将学习如何在Excel 365、2021、2019、2016、2013及更低版本中填充一系列数字、日期和其他数据,创建和使用自定义列表。这篇文章还让你确保你知道关于填充柄的一切,因为你可能会惊讶于这个小选项的强大。 当时间紧迫时,每一分钟…

(二)ffmpeg 下载安装以及拉流推流示例

一、ffmpeg下载安装 官网:https://www.ffmpeg.org/ 源码下载地址:https://www.ffmpeg.org/download.html#releases 下载源码压缩包 下载完成之后解压并在该目录下打开命令窗口 安装依赖环境: sudo apt-get install build-essential nasm …

防火墙操作!

当小编在Linux服务器上部署好程序以后,但是输入URL出现下述情况,原来是防火墙的原因!! 下面是一些防火墙操作! 为保证系统安全,服务器的防火墙不建议关闭!! 但是,我们可…

麒麟 V10 离线 安装 k8s 和kuboard

目录 安装文件准备 主机准备 主机配置 修改主机名(三个节点分别执行) 配置hosts(所有节点) 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包(所有节点) 系统参数设置(所有节点) 时间同步…

C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色

实现效果 调用方法 rtxtLog.AppendTextColorful(richTextBox1,DateTime.Now.ToString(), Color.Red); 完整代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sys…

CentOS7 boa服务器的搭建和配置

环境是CentOS7,但方法不局限于此版系统,应该是通用的。 具体步骤如下: 1. 下载boa源码 下载地址: Boa Webserver 下载后,进入压缩包所在目录,进行解压: tar xzf boa-0.94.13.tar.gz 2. 安装需要的工具b…

了解虚拟路由器冗余协议(VRRP)

虚拟路由器冗余协议(VRRP)是一种被广泛使用的网络协议,旨在增强网络的可靠性和可用性。对于网络管理员和工程师来说,了解VRRP是确保网络能够实现无缝故障转移和保持不间断连接的关键。本文将深入探讨VRRP的基础知识,包…

研究了一款Vue2开发的Markdown编辑器

最近突然喜欢开始写作了,写笔记,写日记,写总结,各种写。所以,想要打造一个自己喜欢的编辑器,于是开始研究。 首先来看看我从Github丄扒拉到的这个开源的代码: 运行起来以后效果是这样的&…

Vue项目打包配置生产环境去掉console.log语句的方法

一、Vue2项目 使用webpack内置的 terser 工具,在vue.config.js文件加上相应的配置即可。 二、Vue3项目 同样是使用 terser 工具,不过vite没有内置terser,需要手动安装依赖 安装完后在vite.config.js文件加上相应的配置即可。 2024-4-9

Xlinx相关原语讲解导航页面

原语就是对FPGA底层器件的直接调用,与IP功能是类似的,将原语的参数变成IP配置时的GUI界面参数,可能会更加直观。IP的缺陷在于繁杂,比如SelectIO IP内部包含IDDR、ODDR等等IO转换的功能,如果只想使用单沿转双沿一个功能…

多因子模型的数据处理

优质博文:IT-BLOG-CN 数据处理的基本目的是从多量的、可能是杂乱无章的、难以理解的数据中抽取并推导出有价值、有意义的数据。特别是金融数据,存在数据缺失,不完整以及极端异常值等问题,对于我们的分析和建模影响很多。 对于我…

逆境突围:网络安全寒冬下售前的效率革命与AI赋能

在网络安全行业遭遇严冬之际,众多企业纷纷勒紧裤腰带,竭力挺过这段寒风凛冽的时期。我朋友所在的网安公司亦未能幸免于这场经济寒潮的冲击,不少售前同事无奈地提前踏上了职业生涯的“毕业”之路,留下的人则如同雪中孤松&#xff0…

【配电网故障定位】基于二进制蝗虫优化算法的配电网故障定位 12节点配电系统故障定位【Matlab代码#75】

文章目录 【获取资源请见文章第5节:资源获取】1. 配电网故障定位2. 二进制蝗虫优化算法3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 配电网故障定位 配电系统故障定位,即在配电网络发生故障的时候&am…

视频号小店究竟有什么秘密,值得商家疯狂入驻,商家必看!

大家好,我是电商花花。 我们都知道视频号和抖音本身都是一个短视频平台,但是随着直播电商的发展,背后的流量推动逐步显露出强大的红利市场和变现机会。 视频号小店流量大和赚钱之外,还非常适合普通人创业。 这也使得越来越多的…

【JAVA基础篇教学】第十篇:Java中Map详解说明

博主打算从0-1讲解下java基础教学,今天教学第十篇:Java中Map详解说明。 在 Java 编程中,Map 接口代表了一种键值对的集合,每个键对应一个值。Map 接口提供了一系列操作方法,可以方便地对键值对进行增删改查等操作。本…

【微信小程序】canvas开发笔记

【微信小程序】canvasToTempFilePath:fail fail canvas is empty 看说明书 最好是先看一下官方文档点此前往 如果是canvas 2d 写canvas: this.canvas,,如果是旧版写canvasId: ***, 解决问题 修改对应的代码,如下所示,然后再试试运行&#x…

要不是情绪管理得当,我早就拍桌子走人了!!!——早读(逆天打工人爬取热门微信文章解读)

身体是革命的本钱! 引言Python 代码第一篇 洞见 中年以后 换个脾气 就是换条命第二篇 人民日报 来了新闻早班车要闻社会政策 结尾 年轻时的我们 如同初生的牛犊 无所畏惧 岁月却教会我们谨慎与尊重 引言 左边突出的神经开始疯狂跳动 不断提醒我 你该休息了 不能再放…

pyside6的QSpinBox自定义特性初步研究(二)

当前的需求是,蓝色背景的画面,需要一个相对应色系的QSpinBox部件。已有的部件风格是这样的,需要新的部件与之般配。 首先新建一个QDoubleSpinBox,并定义其背景色和边框: QDoubleSpinBox { color: white; border:1px…