【c语言】详解 结构体的内存对齐补齐

news2025/1/6 18:30:46

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c语言系列专栏:c语言之路重点知识整合 🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

更多结构体知识点:结构体详解


目录

  • 一、现象
  • 二、原理
    • 用例解释:
      • AA结构体中:
      • AA2结构体中:
  • 文末检验:

一、现象

在这里插入图片描述

先定义一个结构体:

struct AA 
{
	int a; 
	short c; 
	char b; 
}  ;

对该结构体的空间大小进行计算:

int main()
{
	//测试不同结构体的空间大小
	printf("%d\n",sizeof(struct AA));
	return 0;
}

结果为8

在这里插入图片描述


如果将AA结构体中的变量顺序进行改变:

struct AA2
{
	short c;
	int a;
	char b;	
};

再次输出该结构体的内存空间大小:

在这里插入图片描述

我们只是将结构体中的变量顺序进行了改变,内存空间居然发生了改变,结果却变成了12

在这里插入图片描述

按照之前对结构体的理解,我们并没有规定结构体内部变量的定义顺序

从本例可以看出,结构体内部变量的定义顺序也很重要

这种现象就是结构体的内存对齐补齐

二、原理

我本人是这么理解的:

操作系统对内存分配的动态内存分配算法:
结构体这里申请内存空间 使用的是 首次适应算法:从可用的内存空间中找到第一个能够容纳所需内存大小的空间,分配给请求内存的进程

根据结构体中所占字节数最大的 比如int 申请一些4字节的空间段,然后按顺序依次将结构体中其他的数据类型存入到这些相同空间(4字节)的内存段中。

在这里插入图片描述

用例解释:

用上面的AA和AA2结构体例子解释:

AA结构体中:

先根据结构体中的最大类型int确定 结构体中每一段空间为4字节(int的大小)

然后按照从上到下的顺序,将结构体中的变量放入内存段中

如果内存段大于等于变量的类型大小(AA中第一段内存空间4字节刚好放下4字节的a变量)

然后第二段内存空间为4字节,short类型的c变量占用2字节,可以放下,就将c放入,此时第二段内存空间还剩2字节

最后char类型的b变量占用1个字节,现在第二段的可用空间为2字节,可以放下,就将b放入,浪费1字节的空间

最终结果为2×4=8个字节

AA2结构体中:

还是先根据结构体中的最大类型int确定 结构体中每一段空间为4字节(int的大小)

然后按照从上到下的顺序,将结构体中的变量放入内存段中

如果内存段大于等于变量的类型大小,AA2中第一段内存空间4字节大于short类型c变量2字节,就将c放入第一段,此时第一段内存空间剩余2字节。

然后按照顺序该轮到int类型a变量4字节放入内存空间,但此时第一段内存空间只有2字节,就会放入(申请)第二段内存空间

(第二段内存空间和第一段内存空间大小一样,都是根据结构体中的最大类型int确定)(int的大小)

第二段内存空间为4字节,刚好放下a变量

接着时char类型的b变量,占用一个内存,但此时没有可用的内存空间,会再次申请4字节,b变量1个字节小于4字节,放入后浪费3字节的空间。

最终结果为3×4=12个字节

在这里插入图片描述

数组占用的空间:

将数组中的各成员拆成单个,再根据上文的规则放入

在这里插入图片描述

文末检验:

这个XX结构体自己模拟一下叭:

在这里插入图片描述

答案为32个字节,模拟一遍各变量放入内存的过程吧

在这里插入图片描述

因此,对于结构体中变量的定义顺序要有合理的规划,才能做到尽可能地不浪费过多空间。


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络的性能指标

1.计算机网络的性能指标 笔记来源&#xff1a;湖科大教书匠&#xff1a;计算机网络的性能指标 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 速率 注意&#xff1a;数据量中1KB 2 10 B 2^{10}B 210B、数据率中1kb/s 1 0 3 10^{3} 103b/s 1.2…

Chatgpt如何引入新的知识?我们来看下ACL2023 预训练模型能否对新注入的知识进行推理这篇文章

一、概述 title&#xff1a;Can LMs Learn New Entities from Descriptions? Challenges in Propagating Injected Knowledge 论文地址&#xff1a;https://arxiv.org/abs/2305.01651 相关代码&#xff1a; EKP数据和代码&#xff1a;GitHub - yasumasaonoe/entity_knowle…

香橙派4和树莓派4B构建K8S集群实践之四:BuildKit与LNMP

目录 1. 说明 2. 开始前的准备工作 2.1 docker 验证用户信息设置 2.2 安装BuildKit 3. 安装步骤 3.1 申请一个pvc存储区 (wwwroot-pvc.yaml) 3.2 Nginx 3.3 php-fpm 3.3.1 构建并推送镜像 4. 遇到的问题 5. 相关命令 6. 参考 1. 说明 k8s带来的灵活性&#xff0c;使…

Linux系统之安装PDF阅读器

Linux系统之安装PDF阅读器 一、PDF介绍1. PDF简介2. PDF特点3. evince介绍 二、本次实践环境介绍1. 本地环境规划2. 本次实践介绍 三、本地环境检查1. 检查操作系统版本2. 查看系统内核版本 四、安装前准备工作1. 配置yum仓库2. 检查本地yum仓库状态3. 查看evince安装包 五、安…

怎样做好一场线上研讨会?

怎样做好一场线上研讨会&#xff1f; 1-策划和准备。在开始前&#xff0c;需要仔细策划和准备。确定研讨会的主题、目标、议程和参与者&#xff0c;并为参与者提供足够的信息和资源&#xff0c;以确保他们能够充分准备并参与讨论。 2-选择合适的在线平台。选择一个适合您需求…

Ubuntu搭建VPN服务,PPTD和OpenVPN

本文提供了两种vpn方式&#xff0c;pptd移动端支持不够&#xff0c;OpenVPN跨平台能力更前&#xff0c;且安全性更好。 但pptd也不是一无是处&#xff0c;在使用midjuriney网站时&#xff0c;openvpn搭建的网络出现了无法将机器人加入服务器的情况&#xff0c;更换pptd后操作无…

基于Maven创建多模块的Spring Boot项目

使用 Spring Boot的初始化器等创建Spring Boot项目时,需要在pom.xml指定该项目的父项目是 spring-boot-starter-parent。 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><versio…

OSPF综合实验(第二部分)

目录 配置OSPF动态路由协议 重发布 减少路由条目&#xff1a;​ 特殊区域&#xff1a; 收敛配置 认证 NAT地址转换 空接口 配置OSPF动态路由协议 AR1&#xff1a; [r1]ospf 1 router-id 1.1.1.1 [r1-ospf-1]area 1 [r1-ospf-1-area-0.0.0.1]network 172.16.32.0 0.0.0.…

DeepLab V3+

Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation 分割图像的语义编码器-解码器和带孔可分离卷积的技术 摘要 对于语义分割任务&#xff0c;深度神经网络通常使用空间金字塔池化模块或编码器-解码器结构。前者通过以多种速率和多种有效视…

手把手教你安装Redis

在上一篇《Redis简介》中介绍了Redis的一特性和使用场景&#xff0c;下面我们就来动手安装一下Redis 主要分为Windows安装、Linux下安装和Docker下安装 Windows下安装Redis 很不幸&#xff0c;Redis官方不支持windows版本&#xff0c;以下是官方原话 Redis is not officiall…

【P19】JMeter CSS/JQuery提取器(CSS Selector Extractor)

文章目录 一、准备工作二、测试计划设计 一、准备工作 百度&#xff1a; https://www.baidu.com/ 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 使用CSS/JQuery提取器&#xff0c;获取六个百度热搜文本 二、测试计划设计 &#xff08;1&#xff09;、测…

供水管线 码蹄集

题目来源&#xff1a;码蹄集 题目描述&#xff1a; 解决思路&#xff1a; 首先&#xff0c;题目要求我们去掉一些管道&#xff0c;使得总的管道管理费用最小。在去掉部分管道的情况下&#xff0c;城市之间不再形成一个回路&#xff0c;即城市之间构成了一棵树。因此&#xff…

元宇宙医疗虚拟人的功能,创造哪些新体验

虚拟数字人的出现对于精准医疗及人类健康的发展将带来不可估量的作用。通过三维可视化、3D打印、大数据及人工智能等多种数字化手段&#xff0c;在医学研究方面取得新的进展。 居家/健康&#xff1a;智能虚拟管家、家庭虚拟医生、家庭虚拟陪护员 一、虚拟数字人的医学知识普及优…

ChatGPT中文指令(Prompt)角色预设大全!让你的AI更懂你!

ChatGPT的回答总是不令人满意&#xff0c;那可能是你对AI下错了指令/提示词&#xff08;Prompt&#xff09;&#xff0c;想要ChatGPT更懂你&#xff0c;回答更精准&#xff0c;就要给它下对指令。 在国外有大佬们已经整理出一些标准的问话模板&#xff0c;直接拿来使用后&#…

在Python环境中安装配置GDAL,并演示使用GDAL读取shapefile文件

GDAL是应用广泛的空间数据处理库&#xff0c;可以处理几何、栅格数据&#xff0c;Python是一门简单易学的编程语言&#xff0c;常用来编写数据处理工具、脚本。本文讲解如何在Python环境中安装、配置、使用GDAL。本文示例中使用的GDAL版本为3.4.3 一、下载GDAL的whl包 可以通过…

ComPDFKit PDF SDK for Windows crack

ComPDFKit PDF SDK for Windows crack 增加了对新文本编辑功能的支持&#xff0c;如添加其他字体、设置粗体/斜体、复制文本样式和修改文本透明度。 增加了对新级别文档加密的支持&#xff0c;包括AES-128和AES-256。 ComPDFKit PDF SDK允许开发人员在Windows(iOS和Android平台…

C高级-day(4)-(shell数组、shell中的算数、shell中的分支语句.)

一、编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和H…

C/C++中程序数据的分类与内存分布,C++内存管理方式之new / delete 操作符与malloc / free的区别

TIPS const修饰数据类型并不会影响它在内存当中某个区域的存储位置&#xff0c;比方说原先是在栈区上面的&#xff0c;然后用const修饰了一下&#xff0c;并不就是说你现在已经变到静态区里面去了&#xff0c;你还是在栈上面指针与指针之间的等号赋值也需要考虑到权限的放大与…

利用Python程序生成字符画 让男大学生们洗脑的挖呀挖呀挖

源码地址 原教程在这里 演示效果&#xff1a;&#xff08;有点虚&#xff09; 利用Python程序生成字符画 让男大学生们洗脑的挖呀挖呀挖 使用教程&#xff08;源码在文章最后&#xff09; 打开pyhton编译器安装opencv和Pillow库把要进行字符串化的视频命名为input.mp4&#…

nginx: 配置https证书,wss证书

作用&#xff1a;SSL证书卸载 1、制作证书 openssl genrsa -des3 -out server.key 2048 openssl req -new -key server.key -out server.csr openssl rsa -in server.key -out server.key openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt …