当前位置: 首页 > news >正文

C语言柔性数组

目录

  • 什么是柔性数组
  • 柔性数组的使用

什么是柔性数组

柔性数组是在C99中定义的

结构体的最后一个元素允许是未知大小的数组,这就叫柔性书组

柔性数组的长度可以写成0,也可以不规定数组长度
下面两种写法都是正确的

struct S
{
int i;
int a[0];//柔性数组成员
}
struct S
{
int i;
int a[];//柔性数组成员
}
  • 结构体中的柔性数组成员前面至少有一个其他成员
  • sizeof返回的这种结构体的大小不包括柔性数组的大小
  • 包含柔性数组成员的结构体用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大
    小,以适应柔性数组的预期大小。

柔性数组的使用

typedef struct S
{int i;char c[];//c是柔性数组
}S;int main()
{S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));if (p == NULL){perror("malloc");return 1;}p->i = 10;for (int i = 0; i < 10; i++){p->c[i] = 'a';}free(p);p = NULL;return 0;
}

malloc开辟空间时,开辟空间大小为sizeof(S) + 10 * sizeof(char),前面的sizeof(S)其实是表示结构体中int i的大小,后面则是给c开辟了10个字节大小的连续空间

如果觉得前面开辟空间小了,数组c不够长,还可以用realloc函数对内存大小进行调整

int main()
{S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));if (p == NULL){perror("malloc");return 1;}p->i = 10;S* ptr = (S*)realloc(p, sizeof(S) + 20 * sizeof(char));if (ptr == NULL){perror("realloc");return 1;}p = ptr;for (int i = 0; i < 20; i++){p->c[i] = 'a';}free(p);p = NULL;return 0;
}

其实我们也可以写出另一种形式的结构体,它的功能与柔性数组类似

typedef struct S2
{it i;char* c;
}S2;

对于这个结构体的使用如下:

int main()
{S2* p = (S2*)malloc(sizeof(S2));p->i = 10;p->c = (char*)malloc(10 * sizeof(char));for (int i = 0; i < 10; i++){p->c[i] = 'a';}free(p->c);p->c = NULL;free(p);p = NULL;return 0;
}

为了使用这个结构体,需要先给结构体开辟一个空间S2* p = (S2*)malloc(sizeof(S2));然后再需要动态开辟一个块空间让c指向

这种写法需要开辟2次内存,同样在最后释放内存是,也需要free2次

所以就可以看出柔性数组的好处:
第 一个是方便内存释放

因为不论是我们在使用时或给别人写一个函数让别人使用时,如果在里面做了二次内存分配,可能别人使用时并不会知道结构体内部还有一个成员需要释放。所以就需要把内存一次性分配好,在最后释放一次内存就可以了

第二个是加快访问

如果二次内存分配,就会在内存中产生一些内存碎片,这样即浪费了空间也不利于访问

相关文章:

C语言柔性数组

目录什么是柔性数组柔性数组的使用什么是柔性数组 柔性数组是在C99中定义的 结构体的最后一个元素允许是未知大小的数组&#xff0c;这就叫柔性书组 柔性数组的长度可以写成0&#xff0c;也可以不规定数组长度 下面两种写法都是正确的 struct S { int i; int a[0];//柔性数…...

支付功能测试用例

Author&#xff1a;ChatGPT用例设计下面是一些支付功能测试用例&#xff1a;账户余额检查&#xff1a;测试用户的账户余额是否准确。支付方式选择&#xff1a;测试用户可以使用的支付方式&#xff0c;包括信用卡、借记卡、电子钱包等。支付金额确认&#xff1a;测试用户输入的支…...

牛客网Python篇数据分析习题(一)

1.现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID Level&#xff1a;等级 Achievement_value&#xff1a;成就值 Num_of_exercise&a…...

【C语言】“指针类型”与“野指针”

文章目录一、指针是什么❔二、指针和指针类型1.指针-整数2.指针解引用三.野指针1.引起野指针的原因2.如果避免野指针完结一、指针是什么❔ 指针也就是 内存地址 &#xff0c;在计算机上我们访问数据需要通过内存地址来访问&#xff0c;在C语言中&#xff0c;指针变量是用来存放…...

Linux:软链接和硬链接的理解

Linux通过命令行创建快捷方式使用的命令是ln&#xff0c;这里就涉及到了软链接和硬链接&#xff0c;确实有些不好理解&#xff0c;如果你也一样&#xff0c;那么可以继续看下去了 目录ln命令语法实操创建软链接&#xff1a;ln -s [源文件或目录][目标文件或目录]创建硬链接&…...

力扣HOT100 (1-5)

目录 1.两数之和 2.两数相加 拓展到牛客的TOP101的BM11( 链表相加&#xff08;二&#xff09;) 3.无重复的最长子串&#xff08;牛客BM92&#xff09; 解法1&#xff1a; 解法2&#xff1a; 4.寻找两个正序数组的中位数 5.最长回文子串 1.两数之和 思路&#xff1a;用Has…...

车载基础软件——AUTOSAR CP典型应用案例SOME/IP和TSN时间同步

我是穿拖鞋的汉子,魔都中坚持长期主义的一个屌丝工程师! 今天是2023年2月7日,上海还在下着雨,估计是到了梅雨时节(提前到来?),真想说句我劝天公重安排,不让梅雨早时来!!! 老规矩分享一段喜欢的文字,避免自己成为高知识低文化的工科男: “ 我们只需做的,是走好…...

【Linux】操作系统与进程的概念

目录 冯诺依曼体系 注意 为什么CPU不直接访问输入或输出设备&#xff1f; 跨主机间数据的传递 操作系统 管理 进程 描述进程 进程的查看和终止 bash 通过系统调用创建子进程 fork的辨析 冯诺依曼体系 &#x1f956;冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将…...

(1分钟突击面试) 高斯牛顿、LM、Dogleg后端优化算法

高斯牛顿法 LM法 DogLeg方法编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;知识点&#xff1a;高斯牛顿是线搜索方法 LM方法是信赖域方法。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;这个就是JTJ是…...

d3.js与echarts对比

D3.js 和 ECharts 是两种常用的数据可视化工具&#xff0c;它们有着不同的优缺点&#xff1a; D3.js&#xff1a; 优点&#xff1a; 功能强大&#xff0c;提供了极高的灵活性和定制性&#xff0c;支持多种图表类型&#xff0c;如柱状图、饼图、散点图、树图、网络图等。 可以…...

机器学习之K-means原理详解、公式推导、简单实例(python实现,sklearn调包)

目录1. 聚类原理1.1. 无监督与聚类1.2. K均值算法2. 公式推导2.1. 距离2.2. 最小平方误差3. 实例3.1. python实现3.2. sklearn实现4. 运行&#xff08;可直接食用&#xff09;1. 聚类原理 1.1. 无监督与聚类 在这部分我今天主要介绍K均值聚类算法&#xff0c;在这之前我想提一…...

OBS 进阶 一个从自定义对话框中 传参到插件的例子

目录 一、自定义对话框,传参综合例子 1、自定义对话框 1)自定义对话框类...

在Linux和Windows上编译datax-web-ui源码

记录&#xff1a;375场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用apache-maven-3.8.7安装编译datax-web-ui源码。在Windows上操作系统上&#xff0c;使用apache-maven-3.8.7编译datax-web-ui源码。版本&#xff1a;JDK 1.8 node-v14.17.3 npm-6.14.13datax-web-ui开…...

React组件生命周期管理

组件生命,就是组件在不同阶段提供对应的钩子函数,来处理逻辑操作。比如初始化阶段,我们需要初始化组件相关的状态和变量。组件销毁阶段时,我们需要把一些数据结构销毁来节约内存。 React组件生命周期 React组件生命周期分为三个阶段:挂载阶段【Mount】、更新阶段【Updat…...

Linux:全志H3图像codec使用笔记

1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 图像 codec 概述 图像编解码器(codec) 包含 Encoder 和 Decoder 两部分功能。我们用下列分别说明 Encoder 和 Decoder 的工作方式。 ----------…...

【Python小游戏】通过这款专为程序员设计的《极限车神》小游戏,你的打字速度可以赢过专业录入员,这个秘密98%的人都不知道哦~(爆赞)

导语 哈喽&#xff0c;我是你们的木木子&#x1f478;&#xff01; 今天小编要为大家介绍一款小编自己用代码码出来的赛车风格的打字小游戏 取名暂定为《&#x1f697;极限车神&#x1f697;》打字小游戏。 这款Pygame小游戏在玩法上可以说十分创新&#xff0c;不仅能游戏还…...

Springboot扩展点之BeanPostProcessor

前言 Springboot&#xff08;Spring&#xff09;的扩展点其实有很多&#xff0c;但是都有一个共同点&#xff0c;都是围绕着Bean和BeanFactory&#xff08;容器&#xff09;展开的&#xff0c;其实这也很好理解&#xff0c;Spring的核心是控制反转、依赖注入、面向切面编程&…...

Fluent Python 笔记 第 3 章 字典和集合

3.1 泛映射类型 只有可散列 的数据类型才能用作这些映射里的键 字典构造方法&#xff1a; >>> a dict(one1, two2, three3) >>> b {one: 1, two: 2, three: 3} >>> c dict(zip([one, two, three], [1, 2, 3])) >>> d dict([(two, 2…...

大型物流运输管理系统源码 TMS源码

大型物流运输管理系统源码 TMS是一套适用于物流公司的物流运输管理系统&#xff0c;涵盖物流公司内部从订单->提货->运单->配车->点到->预约->签收->回单->代收货款的全链条管理系统。 菜单功能 一、运营管理 1、订单管理&#xff1a;用于客户意向订…...

PCIE总线

PCIE总线记录描述PCI分类与速度PCIE连接拓扑与角色PCIE接口定义PCIE数据传输方式与中断在PCIE中有两种数据传输方式&#xff1a;PCIE中断&#xff1a;PCIE协议栈与工作流程PCIE地址空间分类实例分析PCIE两种访问方式描述 PCI-Express(peripheral component interconnect expre…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...