C语言之认识柔性数组(flexible array)
在学习之前,我们首先要了解柔性数组是放在结构体当中的,知道这一点,我们就开始今天的学习吧!
1.柔性数组的声明
在C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员
这里的结构是结构体
我们看个代码了解:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h>//柔性数组的声明typedef struct S {int n;char c;char arr[0];//它就是柔性数组//还有另一种写法,就是char arr[],这两种写法在我们vs中都是不会出错的 }S; int main() { //printf("%zd\n", sizeof(S));return 0;}
2.柔性数组的特点
1.结构中的柔性数组成员前面必须至少有一个其他成员
2.sizeof返回的这种结果大小不包括柔性数组的内存
3.包含柔性数组成员的结构用malloc函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小
我们可以验证一下:
我们求一下这个结构体的大小:
typedef struct S {int n;char arr[];//它就是柔性数组 }S; int main() {printf("%zd\n", sizeof(S));return 0; }运行一下,我们发现它求出来结构体的大小是前面整型的大小,没有包含这个柔性数组的大小
我们再看一个代码来了解柔性数组的整体特性
typedef struct S {int n;char arr[];//它就是柔性数组 }S; int main() {//未使用这个柔性数组前,计算一下这个结构体的总大小,和后面使用之后作比较//看看有什么不同printf("%d\n", sizeof(S));//我们为这个结构体成员和柔性数组成员分配动态内存空间S* pc = (S*)malloc(sizeof(char) * 10 + sizeof(S));if (pc == NULL){perror("malloc");return 1;}//开始使用柔性数组pc->n = 100;int i = 1;for (i = 1; i <= 10; i++){pc->arr[i] = i;printf("%d ", pc->arr[i]);}//如果空间不足,我们可以进行增容S* str = (S*)realloc(pc,sizeof(S) + sizeof(sizeof(char) * 20));if (str == NULL){printf("%s\n", strerror(errno));return 1;}pc = str;printf("\n");//在这里我们可以求一下现在结构体的大小,看它在使用了柔性数组之后//结构体的总大小是否发生了变化printf("%d\n", sizeof(S));//释放空间free(pc);pc = NULL;return 0; }我们运行查看一下结果
我们发现
1.结构体使用柔性数组前后,结构体总大小没有发生变化,都是4
2.我们使用别的办法也可以达到柔性数组所达到的效果,为什么还要存在柔性数组呢?
这就引出了我们下一个知识点,为什么存在柔性数组
3.为什么存在柔性数组
我们用别的办法实现一下这个柔性数组所实现的功能,对比着来看更能理解
typedef struct S {int n;char* arr; }S;int main() {printf("未动态开辟时内存大小:%zd\n", sizeof(S));//为整个结构体分配动态内存空间S* pc = (S*)malloc(sizeof(S));if (pc == NULL){perror("malloc");return 1;}//使用这块空间pc->n = 100;//再用malloc为指针arr分配空间pc->arr = (char*)malloc(sizeof(char) * 10);if (pc->arr == NULL){perror("malloc");return 1;}//使用给arr分配的这块空间int i = 0;for (i =0; i < 10; i++){pc->arr[i] = 'Q';printf("%c ", pc->arr[i]);}printf("\n");printf("malloc这块空间后内存大小:%zd\n", sizeof(S));//对这块空间进行增容char* ptr = (char*)realloc(pc->arr, sizeof(char) * 20);if (ptr == NULL){perror("realloc");return 1;}//使用增容后的空间ptr = pc->arr;for (i = 0; i < 10; i++){pc->arr[i] = 'L';printf("%c ",pc->arr[i]);}printf("\n");printf("realloc这块空间后内存大小:%zd\n", sizeof(S));//释放空间free(pc->arr);pc->arr = NULL;free(pc);pc = NULL;return 0; }
我们比较一下两种写法,它们可以达到一样的效果
但是
柔性数组:
1.malloc只需要开辟一次
2.free空间一次
3.开辟的空间是连续的
普通写法:
1.malloc两次
2.free两次
3.开辟的空间不一定连续
我们要知道malloc的次数越多,越容易处处,可能free顺序不对或者忘记free,造成内存泄漏;同时,内存碎片越多,没别利用的空间就越多,造成空间的浪费。
此时,我们就要知道存在即合理,柔性数组的存在是有一定的道理的。
接下来我们总结一下柔性数组的好处
4.柔性数组的好处
1.方便内存释放(我们在为什么存在柔性数组里已经分析过了)
2.有利于提高访问效率
连续的内存有益于提高访问速度,也有益于减少内存碎片
好了,这就是关于柔性数组的全部知识,大家要慢慢感悟,咱们下期再见!!!
相关文章:
C语言之认识柔性数组(flexible array)
在学习之前,我们首先要了解柔性数组是放在结构体当中的,知道这一点,我们就开始今天的学习吧! 1.柔性数组的声明 在C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员 这里的结构是结构…...
【MATLAB基础绘图第17棒】绘制玫瑰图
MATLAB绘制玫瑰图 玫瑰图(Nightingale Rose Chart)风玫瑰图(WindRose)准备工作:WindRose工具包下载案例案例1:基础绘图 参考 玫瑰图(Nightingale Rose Chart) 玫瑰图(Ni…...
Qt 基于海康相机的视频绘图
需求 在视频窗口上进行绘图,包括圆,矩形,扇形等 效果: 思路: 自己取图然后转成QImage ,再向QWidget 进行渲染,根据以往的经验,无法达到很高的帧率。因此决定使用相机SDK自带的渲染…...
FlinkCDC实现主数据与各业务系统数据的一致性(瀚高、TIDB)
文章末尾附有flinkcdc对应瀚高数据库flink-cdc-connector代码下载地址 1、业务需求 目前项目有主数据系统和N个业务系统,为保障“一数一源”,各业务系统表涉及到主数据系统的字段都需用主数据系统表中的字段进行实时覆盖,这里以某个业务系统的一张表举例说明:业务系统表Ta…...
JSP:Servlet
Servlet处理请求过程 B/S请求响应模型 Servlet介绍 JSP是Servlet的一个成功应用,其子集。 JSP页面负责前台用户界面,JavaBean负责后台数据处理,一般的Web应用采用JSPJavaBean就可以设计得很好了。 JSPServletJavaBean是MVC Servlet的核心…...
react中的state
没想到hooks中也有state这一说法 看下面的两个案例 1、无state变化不会执行父子函数 2、有state更改执行父子函数...
VR全景航拍要注意什么,航拍图片如何处理
引言: VR全景航拍技术是当前摄影和航拍领域的新潮流。它采用虚拟现实技术,通过360度全景镜头捕捉画面,可以为观众提供身临其境的视觉体验。在宣传展示中,利用VR全景航拍技术可以为品牌宣传带来更加生动、震撼的视觉效果。 一、航拍注意事项 …...
Spark---集群搭建
Standalone集群搭建与Spark on Yarn配置 1、Standalone Standalone集群是Spark自带的资源调度框架,支持分布式搭建,这里建议搭建Standalone节点数为3台,1台master节点,2台worker节点,这虚拟机中每台节点的内存至少给…...
Linux上通过SSL/TLS和start tls连接到LDAP服务器
一,大致流程。 1.首先在Linux上搭建一个LDAP服务器 2.在LDAP服务器上安装CA证书,服务器证书,因为SSL/TLS,start tls都属于机密通信,需要客户端和服务器都存在一个相同的证书认证双方的身份。3.安装phpldapadmin工具&am…...
【华为OD题库-034】字符串化繁为简-java
题目 给定一个输入字符串,字符串只可能由英文字母(a ~ z、A ~ Z)和左右小括号()组成。当字符里存在小括号时,小括号是成对的,可以有一个或多个小括号对,小括号对不会嵌套,小括号对内可以包含1个或多个英文字母也可以不…...
斯坦福大学引入FlashFFTConv来优化机器学习中长序列的FFT卷积
斯坦福大学的FlashFFTConv优化了扩展序列的快速傅里叶变换(FFT)卷积。该方法引入Monarch分解,在FLOP和I/O成本之间取得平衡,提高模型质量和效率。并且优于PyTorch和FlashAttention-v2。它可以处理更长的序列,并在人工智能应用程序中打开新的可…...
信息系统项目管理师-干系人管理论文提纲
快速导航 1.信息系统项目管理师-项目整合管理 2.信息系统项目管理师-项目范围管理 3.信息系统项目管理师-项目进度管理 4.信息系统项目管理师-项目成本管理 5.信息系统项目管理师-项目质量管理 6.信息系统项目管理师-项目资源管理 7.信息系统项目管理师-项目沟通管理 8.信息系…...
Windmill:最快的自托管开源工作流引擎
我们对 Windmill 进行了基准测试,认为它是 Airflow、Prefect 甚至 Temporal 中最快的自托管通用工作流引擎。对于 Airflow,有速度快了 10 倍! 工作流引擎编排工作人员的有向无环图 (DAG) 中定义的作业,同时尊重依赖性。 主要优点…...
线性代数 - 几何原理
目录 序言向量的定义线性组合、张成空间与向量基线性变换和矩阵线性复合变换与矩阵乘法三维空间的线性变换行列式矩阵的秩和逆矩阵维度变换点乘叉乘基变换特征值和特征向量抽象向量空间 序言 欢迎阅读这篇关于线性代数的文章。在这里,我们将从一个全新的角度去探索线…...
火电厂电气部分设计
摘要 本文首先根据任务书上所给系统与线路及所有负荷的参数,分析负荷发展趋势。从负荷增长方面阐明了建站的必要性,然后通过对拟建变电站的概括以及出线方向来考虑,并通过对负荷资料的分析,安全,经济及可靠性方面考虑…...
界面组件DevExpress Reporting v23.1 - Web报表设计器功能升级
DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表 界面组件DevExpress Reporting v23.1已经发布一段…...
小程序Canvas 2D问题解决,如安卓drawImage不执行、动态高度设置、高度1365(或4096)限制等
我的最新版小程序想在绘制时使用自定义字体,需要将旧版canvas升级到2d新版,发现了许多问题,下面记录一下并提供解决思路,仅供参考,欢迎提供新思路。 一、开发工具和安卓上drawImage不执行,绘制出来是空白&…...
人工智能对网络安全的影响越来越大
如果问当前IT行业最热门的话题是什么,很少有人会回答除了人工智能(AI)之外的任何话题。 在不到 12 个月的时间里,人工智能已经从一项只有 IT 专业人员才能理解的技术发展成为从小学生到作家、程序员和艺术家的每个人都使用的工具…...
JavaEE(SpringMVC)期末复习
文章目录 JavaEE期末复习一、单选题: JavaEE期末复习 一、单选题: 1.Spring的核⼼技术是( A )? A依赖注入 B.JdbcTmplate C.声明式事务 D.资源访问 Spring的核心技术包括依赖注入(Dependency Injection&am…...
微服务保护 Sentinel
1.初识Sentinel 文章目录 1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链…...
如何彻底解决微信QQ消息撤回难题:Windows平台防撤回与多开终极指南
如何彻底解决微信QQ消息撤回难题:Windows平台防撤回与多开终极指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https:…...
终极指南:如何用Revelation光影包打造电影级Minecraft画面
终极指南:如何用Revelation光影包打造电影级Minecraft画面 【免费下载链接】Revelation An explorative shaderpack for Minecraft: Java Edition 项目地址: https://gitcode.com/gh_mirrors/re/Revelation 想让你的Minecraft世界从简单的像素方块变成震撼的…...
当SLAM遇上‘六边形战士’:拆解M2DGR如何用红外与事件相机挑战黑暗与电梯场景
当SLAM技术遭遇极端环境:红外与事件相机在黑暗与电梯场景中的突破 在机器人自主导航领域,SLAM(Simultaneous Localization and Mapping)技术一直是核心挑战之一。传统SLAM系统在光线充足、环境稳定的常规场景中表现良好ÿ…...
DS4Windows完整指南:如何在Windows电脑上完美使用PlayStation手柄玩游戏
DS4Windows完整指南:如何在Windows电脑上完美使用PlayStation手柄玩游戏 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾经想在Windows电脑上使用PlayStation手柄玩游…...
机器学习中不平衡数据集处理技术与实战
1. 不平衡数据集处理的核心挑战在真实世界的数据分析项目中,我们经常会遇到类别分布严重不均衡的数据集。比如信用卡欺诈检测中正常交易占99.9%、医疗诊断中健康样本远多于患病样本、工业质检中合格品数量远超缺陷品。这类数据直接扔给机器学习模型训练,…...
real-anime-z惊艳效果展示:8K细节、光影质感与角色神态真实呈现
real-anime-z惊艳效果展示:8K细节、光影质感与角色神态真实呈现 1. 模型简介 real-anime-z是基于Z-Image的LoRA版本开发的文生图模型,专注于生成具有真实感的动画风格图片。这个模型通过Xinference部署,并提供了Gradio交互界面,…...
Android轻量级依赖注入框架illuminati:原理、实战与选型指南
1. 项目概述:当“光照派”遇上代码最近在GitHub上闲逛,发现一个名字相当吸睛的项目——LeeKyoungIl/illuminati。初看这个名字,你可能会联想到历史传说中那个神秘的组织,或者丹布朗小说里的情节。但在程序员的语境里,它…...
Qwen3-0.6B-FP8惊艳效果:软链机制实现模型热切换的5秒操作演示
Qwen3-0.6B-FP8惊艳效果:软链机制实现模型热切换的5秒操作演示 1. 开篇:一个让模型切换像换衣服一样简单的技术 你有没有遇到过这样的场景?部署了一个AI模型,用了一段时间后,发现平台更新了模型权重文件,…...
Phi-3-mini-4k-instruct-gguf惊艳效果展示:10个真实Prompt生成结果全公开
Phi-3-mini-4k-instruct-gguf惊艳效果展示:10个真实Prompt生成结果全公开 1. 模型简介 Phi-3-Mini-4K-Instruct是一个38亿参数的轻量级开源模型,采用GGUF格式提供。作为Phi-3系列的一员,这个模型经过精心训练,专注于高质量内容和…...
Dev Containers 为什么越用越卡?揭秘90%开发者忽略的5个Dockerfile反模式及3步修复法
更多请点击: https://intelliparadigm.com 第一章:Dev Containers 性能退化现象的系统性归因 Dev Containers 在提供环境一致性的同时,常在实际开发中表现出显著的性能退化——包括启动延迟增加、文件监听响应迟缓、调试器连接超时及 CPU/内…...




