高阶C语言补充:柔性数组
C99中,结构体中最后一个元素允许时未知大小的数组,这就叫做柔性数组成员。
vs编译器也支持柔性数组。
之所以把柔性数组单独列出,是因为:
1、柔性数组是建立在结构体的基础上的。
2、柔性数组的使用用到了动态内存分配。
这使得柔性数组不能单独的放在其他两篇文章当中,因此本文较为剪短,只介绍柔性数组这一个概念。
柔性数组的声明:
1、一定是在结构体中。
2、柔性数组前面一定要有 其他成员。
typedef struct s
{int i;int a[0];//柔性数组成员
}type_a;//若编译器其无法通过,则可以写为:
typedef struct st_type
{int i;int a[];//柔性数组成员
}type_a;
柔性数组的特点:
1、结构体中的柔性数组成员前必须至少有一个其他成员。
2、sizeof返回的这种结构体的大小不包括柔性数组的内存。
3、包含柔性数组成员的结构体用malloc函数进行动态内存分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。
struct S
{int n;int arr[];//柔性数组成员
};//柔性数组成员和int*型成员类似
struct S
{int n;int* arr;
};
异:
1、柔性数组只需要一次malloc就可以完成结构体成员和数组的创建。
2、int*成员需要两次malloc来开辟,两次free来释放。
同:
1、柔性数组和int*成员两个都需要malloc来开辟空间、free释放。
柔性数组的使用
int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);if (ps == NULL){return 1;}ps->n = 100;int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i;}for (i = 0; i < 10; i++){printf("%d ", ps->arr[i]);}//调整大小struct S* ptr = (struct S*)realloc(ptr, sizeof(struct S) + 80);if (ptr != NULL){ps = ptr;ptr = NULL;}//释放free(ps);//只需要一次释放ps = NULL;return 0;
}
int*成员的使用
int main()
{//创建struct S* ps = (struct S*)malloc(sizeof(struct S));//第一次mallocif (ps == NULL){//...return 1;}ps->n = 100;ps->arr = (int*)malloc(40);//第二次mallocif (ps->arr == NULL){//..报错return 1;}//使用int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i;}for (i = 0; i < 10; i++){printf("%d ", ps->arr[i]);}//扩容int* ptr = (int*)realloc(ps->arr, 80);if (ptr == NULL){return 1;}ps->arr = ptr;ptr = NULL;//释放//两次释放free(ps->arr);free(ps);return 0;
}
1、malloc的次数越多,free的次数越多,越容易造成内存泄漏。
2、malloc的次数越多,造成的内存碎片就越多,程序的性能就越低。
柔性数组的优势
- 方便内存的释放。
- 连续的内存能提高访问速度
柔性数组只需要释放一次,不易产生内存泄漏。malloc一次开辟的空间是连续的,对内存的访问速度更高。
一个结构体中只允许存在一个柔性数组。
相关文章:
高阶C语言补充:柔性数组
C99中,结构体中最后一个元素允许时未知大小的数组,这就叫做柔性数组成员。 vs编译器也支持柔性数组。 之所以把柔性数组单独列出,是因为: 1、柔性数组是建立在结构体的基础上的。 2、柔性数组的使用用到了动态内存分配。 这使得柔…...
S32K324信息安全-使用IC5000/IC5700进行debug口解锁
文章目录 前言winIDEA配置参考 前言 由于信息安全要求,需要对debug口(JTAG)进行加密,本文介绍基于固定密码的方式,使用IC5000/IC5700进行debug口解锁的方法 winIDEA配置 点击 Hardware | CPU Options | Reset | Ini…...
简单实现QT对象的[json]序列化与反序列化
简单实现QT对象的[json]序列化与反序列化 简介应用场景qt元对象系统思路实现使用方式题外话 简介 众所周知json作为一种轻量级的数据交换格式,在开发中被广泛应用。因此如何方便的将对象数据转为json格式和从json格式中加载数据到对象中就变得尤为重要。 在python类…...
Unity肢体控制(关节控制)
前面的基础搭建网上自己搜,我这个任务模型网上也有,可以去官网看看更多模型,这里只讲述有模型如何驱动肢体的操作方式 第一步:创建脚本 第二步:创建Rig Builder 建空容器 加部件(Rig),加了之后…...
Node.js | Yarn下载安装与环境配置
一、安装Node.js Yarn 是 Node.js 下的包管理工具,因此想要使用 Yarn 就必须先下载 Node.js。 推荐参考:Node.js | npm下载安装及环境配置教程 二、Yarn安装 打开cmd,输入以下命令: npm install -g yarn检查是否安装成功&…...
WPF如何全局应用黑白主题效果
灰白色很多时候用于纪念,哀悼等。那么使用 WPF如何来做到这种效果呢?要实现的这种效果,我们会发现,它其实不仅仅是要针对图片,而是要针对整个窗口来实现灰白色。 如果只是针对图片的话,我可以可以对图片进…...
[Qt] Qt删除文本文件中的某一行
需求 我们经常读一个文件或者直接往一个空白文件中写文本,那么该如何使用Qt在一个文本文件中删除某一行 代码 #include <QCoreApplication> #include <QIODevice> #include <QFile> #include <QTextStream> #include <QString> #i…...
【HarmonyOS学习日志(9)】一次开发,多端部署之界面级一多开发
关于一次开发,多端部署 一次开发多端部署就是指一套代码工程,一次开发上架,多端按需部署(一多),用于支撑开发者快速高效地开发多终端设备上的应用,以节省开发成本。 HarmonyOS系统面向多终端&…...
基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现六
一、前言介绍: 免费学习:猿来入此 1.1 项目摘要 随着人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,宠物的数量增长也带来了一系列问题,如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养…...
Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化教…...
解析 Android WebChromeClient:提升 WebView 用户体验的关键组件
文章目录 一、总览二、详细说明三、一些实际和有趣的应用四、最佳实践五、与其他组件的比较六、安全性考虑:防止 XSS 攻击与数据泄露6.1 介绍6.2 代码案例6.2.1 输入过滤6.2.2 Content Security Policy (CSP) 案例 六、总结 在 Android 开发中,WebChrome…...
【LeetCode热题100】字符串
本篇博客记录了关于字符串相关的几道题目,包括最长公共前缀、最长回文子串、二进制求和、字符串相乘。 //解法1 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string ret strs[0];for(int i 1 ; i < strs.size() ; i…...
OceanBase 闪回查询
前言 在OB中,drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时,由于delete操作的对象不会进入回收站,此时需要通过闪回查询功能查看delete的数据,以便后续恢复 本次实验版本为 OceanBase 4.2.1.8࿰…...
C++析构函数详解
C析构函数详解:对象销毁与资源清理 在 C 中,析构函数是与构造函数相对应的特殊成员函数,它在对象生命周期结束时被自动调用,用于执行对象销毁之前的清理操作。析构函数主要用于释放对象占用的资源,如动态分配的内存、打…...
【网络安全 | 漏洞挖掘】未授权获取AI聊天内容
未经许可,不得转载。 文章目录 两天前,我收到了一项私人项目的邀请,内容看起来像是一个聊天机器人,类似于 Gemini 或 ChatGPT。于是我开始测试该项目的一些业务逻辑漏洞和 IDOR(不当访问控制)漏洞。尽管这个产品拥有一个强大的安全团队,网站上也部署了 WAF(Web 应用防火…...
时间序列分析——移动平均法、指数平滑法、逐步回归法、趋势外推法等(基于Python实现)
第 11章——时间序列分析和预测 【例11-1】 绘制时间序列折线图—观察成分 【代码框11-1】——绘制时间序列折线图 # 图11-2的绘制代码 import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[SimHei...
opencv(c++)----图像的读取以及显示
opencv(c)----图像的读取以及显示 imread: 作用:读取图像文件并将其加载到 Mat 对象中。参数: 第一个参数是文件路径,可以是相对路径或绝对路径。第二个参数是读取标志,比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…...
PyTorch——从入门到精通:PyTorch基础知识(张量)【PyTorch系统学习】
什么是张量(Tensor) 张量在数学中是一个代数对象,描述了与矢量空间相关的代数对象集之间的多重线性映射。张量是向量和矩阵概念的推广,可以理解为多维数组。作为数学中的一个基本概念,张量有着多种类型,…...
(笔记)ubuntu20安装jdk7,多版本管理
前往 Oracle JDK 7 下载页面(需要 Oracle 账户),下载 JDK 7 的压缩包文件(.tar.gz)。 下载完成后,将文件解压到 /opt 目录: sudo tar -xzf jdk-7u<version>-linux-x64.tar.gz -C /opt 重…...
Python系列教程
文章目录 1. Python基础2. Python基础库3. Python数据分析 1. Python基础 语句数据类型表达式输入、输出与文件读写函数模块与包类与面向对象作用域与命名空间常用技巧与操作 2. Python基础库 Typing库 3. Python数据分析...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
