结构体介绍及内存大小分配问题
结构体
- 一.结构体的介绍
- 1.1结构体的声明
- 1.2匿名结构体
- 1.3结构的自引用
- 1.4使用 typedef 简化结构体类型名
- 二.结构体内存对齐
- 2.1内存对齐规则
- 2.2结构体内存对齐原因
- 2.3修改默认对齐数
在 C 语言中,结构体(struct)是一种用户自定义的数据类型,它允许你将不同类型的数据项组合在一起,形成一个新的数据类型,以便更方便地管理和操作相关的数据。
一.结构体的介绍
1.1结构体的声明
在使用结构体时,要使用到struct关键字.使用方法如下:
struct 结构体名 {数据类型 成员1;数据类型 成员2;// 可以有更多的成员
}变量名1, 变量名2, ...;
要注意的是,在声明结构体最后大括号的末尾要加上";" .
对结构体进行引用时,可以通过’.‘来进行使用,也可以用"->’'来对指针进行解引用.
就以学生结构体为例:
#include <stdio.h>struct Stu{char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号
};int main()
{//按照结构体成员的顺序初始化 struct Stu s = { "张三", 20, "男", "20230818001" };printf("name: %s\n", s.name);printf("age : %d\n", s.age);printf("sex : %s\n", s.sex);printf("id : %s\n", s.id);
1.2匿名结构体
在声明结构体时,结构体名处可以为空.
但是匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。
1.3结构的自引用
结构体的自引用是非法的.
struct Node{int data;struct Node next;
};
就如上述代码而言,若我们在求此结构体的大小时,一个结构体中包含着着一个整型类型和一个类型一样的结构体.那么在这个结构体中,可想而知所占内存是无限的.
所以显然结构的自引用是不可以的.
1.4使用 typedef 简化结构体类型名
typedef struct 结构体名 {数据类型 成员1;数据类型 成员2;// 可以有更多的成员
} 新类型名;
使用 typedef 关键字可以为结构体类型定义一个新的类型名,从而简化结构体变量的声明,之后就可以直接使用 新类型名 来声明变量,而不需要再写 struct 关键字。
二.结构体内存对齐
结构体的内存对齐作为最热门的考点之一,我们绝对有将它学好的必要.
内存对齐指的是编译器为结构体的每个成员按照一定的规则分配内存空间,使得每个成员的起始地址满足特定的对齐要求,而不是简单地按照成员的顺序依次排列存储。最终结构体所占用的内存大小可能会大于其所有成员实际所需内存大小之和。
2.1内存对齐规则
内存对齐主要遵循以下几个规则:
- 成员对齐规则:每个成员的起始地址必须是该成员类型大小的整数倍。例如,char 类型(通常大小为 1 字节)可以从任意地址开始存储;int 类型(通常大小为 4 字节)的起始地址必须是 4 的整数倍;double 类型(通常大小为 8 字节)的起始地址必须是 8 的整数倍。
- 结构体整体对齐规则:结构体的总大小必须是其最大成员类型大小的整数倍。如果结构体总大小不是最大成员类型大小的整数倍,编译器会在结构体末尾填充额外的字节以满足该条件。
- 默认对齐系数:不同编译器有不同的默认对齐系数,例如在 GCC 编译器中,默认对齐系数通常为 8。可以使用 #pragma pack 指令来修改对齐系数。
struct S1
{char c1;int i;char c2;
};
printf("%d\n", sizeof(struct S1));struct S2
{char c1;char c2;int i;
};
printf("%d\n", sizeof(struct S2));`
拿结构体s1 和 s2 为例,这两个结构体所储存的数据类型相同.但所占内存大小却不相同;
s1:内存分析
char c1:char 类型占 1 个字节,从地址 0 开始存储。
int i:int 类型通常占 4 个字节,并且它的起始地址必须是 4 的整数倍。由于 c1 只占 1 个字节,为了满足 i 的对齐要求,需要在 c1 后面填充 3 个字节,这样 i 就从地址 4 开始存储,占用 4 个字节。
char c2:char 类型占 1 个字节,接着 i 存储,位于地址 8。
结构体整体对齐:结构体的总大小必须是其最大成员(这里是 int 类型,占 4 个字节)大小的整数倍。目前已用 9 个字节,为了满足整体对齐要求,需要在 c2 后面再填充 3 个字节,所以结构体 S1 的总大小为 12 字节。
s2:内存分析
char c1:char 类型占 1 个字节,从地址 0 开始存储。
char c2:char 类型也占 1 个字节,可以紧接着 c1 存储,位于地址 1。
int i:int 类型占 4 个字节,其起始地址必须是 4 的整数倍。目前 c1 和 c2 共占 2 个字节,为了满足 i 的对齐要求,需要在 c2 后面填充 2 个字节,这样 i 就从地址 4 开始存储,占用 4 个字节。
结构体整体对齐:结构体的总大小为 8 字节,正好是最大成员(int 类型,占 4 个字节)大小的整数倍,无需额外填充。所以结构体 S2 的总大小为 8 字节。
2.2结构体内存对齐原因
内存对齐主要有以下两个原因:
-
提高访问效率:大多数计算机系统在访问特定类型的数据时,要求数据的起始地址是该类型大小的整数倍,这样可以提高数据访问的效率。如果数据没有对齐,处理器可能需要多次访问内存才能获取完整的数据。
-
硬件限制:某些硬件平台只能在特定地址上访问特定类型的数据,如果数据没有按照要求对齐,可能会导致硬件错误。
2.3修改默认对齐数
在 C 语言中,你可以使用 #pragma pack 预处理指令来修改默认的对齐数。
#pragma pack 指令可以指定结构体成员的对齐方式,改变编译器默认的对齐规则。下面详细介绍其使用方法,并结合之前的结构体示例进行说明。
#pragma pack 指令的基本用法
- #pragma pack(n):将对齐系数设置为 n,n 必须是 1、2、4、8、16 等 2 的幂次方。在这个指令之后定义的结构体将按照指定的对齐系数进行对齐。
- #pragma pack():恢复默认的对齐系数。
相关文章:
结构体介绍及内存大小分配问题
结构体 一.结构体的介绍1.1结构体的声明1.2匿名结构体1.3结构的自引用1.4使用 typedef 简化结构体类型名 二.结构体内存对齐2.1内存对齐规则2.2结构体内存对齐原因2.3修改默认对齐数 在 C 语言中,结构体(struct)是一种用户自定义的数据类型&a…...

halcon 条形码、二维码识别、opencv识别
一、条形码 函数介绍 create_bar_code_model * 1.创建条码读取器的模板 * 参数一:通用参数的名称,针对条形码模型进行调整。默认值为空 * 参数二:针对条形码模型进行调整 * 参数三:条形码模型的句柄。 create_bar_code_model (…...

Vue框架的使用 搭建打包 Vue的安全问题(Xss,源码泄露)
前言 什么是Vue? Vue是轻量级的js框架 可以帮助我们一键构造网站,打包app程序等 Vue的基本使用 1、构造框架并启用 新建一个 目录 使用终端切换到当前的目录 创建vue项目 第一个弹出使用语法我们选择是 剩下的全选择否 发现创建好了 接着进行…...

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下,5G 通信技术的普及、云计算能力…...

day2 - SpringBoot框架开发技术
主要内容 1. SpringBoot简介 2. 构建springboot工程 3. springboot接口返回json 4. springboot热部署 5. springboot资源属性配置 6. springboot整合模板引擎 7. springboot异常处理 8. springboot整合MyBatis 9. springboot整合redis 10. springboot整合定时任务 11. springbo…...

Flash-03
1-问题:Flash软件画两个图形,若有部分重合则变为一个整体 解决方法1:两个图形分属于不同的图层 解决方法2:将每个图形都转化为【元件】 问题2:元件是什么? 在 Adobe Flash(现在称为 Adobe Anim…...

新建菜单项的创建之CmpGetValueListFromCache函数分析
第一部分: PCELL_DATA CmpGetValueListFromCache( IN PHHIVE Hive, IN PCACHED_CHILD_LIST ChildList, OUT BOOLEAN *IndexCached, OUT PHCELL_INDEX ValueListToRelease ) 0: kd> dv KeyControlBlock 0xe1…...

【Word2Vec】Skip-gram 的直观理解(深入浅出)
01 什么是skip-gram 一句话来说就是,给定中心词,然后预测其周围的词: 02 模型结构 对于skip-gram来说,输入是一个[1 x V]维的ont-hot向量,其中V为词表大小,值为1的那一项就表示我们的中心词。经过一个[V x…...

在MacOS上打造本地部署的大模型知识库(一)
一、在MacOS上安装Ollama docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main 最后停掉Docker的ollama,就能在webui中加载llama模…...

(21)从strerror到strtok:解码C语言字符函数的“生存指南2”
❤个人主页:折枝寄北的博客 ❤专栏位置:简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…...

DeepSeek推出DeepEP:首个开源EP通信库,让MoE模型训练与推理起飞!
今天,DeepSeek 在继 FlashMLA 之后,推出了第二个 OpenSourceWeek 开源项目——DeepEP。 作为首个专为MoE(Mixture-of-Experts)训练与推理设计的开源 EP 通信库,DeepEP 在EP(Expert Parallelism)…...

1.2 Kaggle大白话:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据
目录 0. 本栏目竞赛汇总表1. 本文主旨2. AI工程架构3. 数据预处理模块3.1 配置数据路径和处理参数3.2 配置API参数3.3 配置输出路径 4. AI并行处理模块4.1 定义LLM客户端类4.2 定义数据处理函数4.3 定义JSON保存函数4.4 定义数据分片函数4.5 定义分片处理函数4.5 定义文件名排序…...

数据结构-顺序表专题
大家好!这里是摆子,今天给大家带来的是C语言数据结构开端-顺序表专题,主要介绍了数据结构和动态顺序表的实现,快来看看吧!记得一键三连哦! 1.数据结构的概念 1.1什么是数据结构? 数据结构是计…...
docker和containerd从TLS harbor拉取镜像
私有镜像仓库配置了自签名证书,https访问,好处是不需要处理免费证书和付费证书带来的证书文件变更,证书文件变更后需要重启服务,自签名证书需要将一套客户端证书存放在/etc/docker/cert.d目录下,或者/etc/containerd/c…...

kafka-关于ISR-概述
一. 什么是ISR ? Kafka 中通常每个分区都有多个副本,其中一个副本被选举为 Leader,其他副本为 Follower。ISR 是指与 Leader 副本保持同步的 Follower 副本集合。ISR 机制的核心是确保数据在多个副本之间的一致性和可靠性,同时在 …...

el-input实现金额输入
需求:想要实现一个输入金额的el-input,限制只能输入数字和一个小数点。失焦数字转千分位,聚焦转为数字,超过最大值,红字提示 效果图 失焦 聚焦 报错效果 // 组件limitDialog <template><el-dialog:visible.s…...
C++11智能指针
一、指针管理的困境 资源释放了,但指针没有置空(野指针、指针悬挂、踩内存) 没有释放资源,产生内存泄漏问题;重复释放资源,引发coredump 二、智能指针...

安装Git(小白也会装)
一、官网下载:Git 1.依次点击(红框) 不要安装在C盘了,要炸了!!! 后面都 使用默认就好了,不用改,直接Next! 直到这里,选第一个 这两种选项的区别如…...

驭势科技9周年:怀揣理想,踏浪前行
2025年的2月,驭势科技迎来9岁生日。位于国内外不同工作地的Uiseeker齐聚线上线下,共同庆祝驭势走过的璀璨九年。 驭势科技联合创始人、董事长兼CEO吴甘沙现场分享了驭势9年的奔赴之路,每一段故事都包含着坚持与拼搏。 左右滑动查看更多 Part.…...

一款在手机上制作电子表格
今天给大家分享一款在手机上制作电子表格的,免费好用的Exce1表格软件,让工作变得更加简单。 1 软件介绍 Exce1是一款手机制作表格的办公软件,您可以使用手机exce1在线制作表格、工资表、编辑xlsx和xls表格文件等,还可以学习使用…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...