当前位置: 首页 > 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…...

泛微OA E9提醒功能实战:手把手教你用HTML美化定时邮件,告别枯燥系统通知

泛微OA E9邮件提醒设计指南&#xff1a;打造高转化率的HTML通知模板 每周五下午3点&#xff0c;市场部的李经理都会收到一封来自OA系统的周报提醒邮件。与往常不同的是&#xff0c;这次邮件的设计让人眼前一亮——精致的品牌配色、清晰的行动按钮、适配手机的版式布局。原本被…...

MusePublic圣光艺苑快速部署:ARM架构Mac M系列芯片适配可行性分析

MusePublic圣光艺苑快速部署&#xff1a;ARM架构Mac M系列芯片适配可行性分析 1. 项目概述与背景 MusePublic圣光艺苑是一个专为艺术创作设计的沉浸式AI生成平台&#xff0c;它将先进的大模型技术与古典艺术美学完美融合。这个平台基于Stable Diffusion XL架构&#xff0c;专…...

零代码操作!FUTURE POLICE亮色界面详解:从上传到下载SRT全流程

零代码操作&#xff01;FUTURE POLICE亮色界面详解&#xff1a;从上传到下载SRT全流程 1. 认识FUTURE POLICE&#xff1a;高精度字幕对齐工具 你是否遇到过这样的困扰&#xff1f;精心制作的视频字幕总是与语音不同步&#xff0c;手动调整时间轴既耗时又费力。FUTURE POLICE正…...

Qwen3-TTS语音合成教程:长文本自动分段与上下文语义连贯性保障

Qwen3-TTS语音合成教程&#xff1a;长文本自动分段与上下文语义连贯性保障 语音合成新体验&#xff1a;Qwen3-TTS让长文本语音合成变得简单自然&#xff0c;支持10种语言&#xff0c;3秒声音克隆&#xff0c;端到端延迟仅97ms 1. 快速了解Qwen3-TTS Qwen3-TTS-12Hz-1.7B-Base是…...

旧笔记本别扔!用飞牛OS+阿里云DDNS,5分钟搞定个人云盘外网访问

旧笔记本改造指南&#xff1a;用飞牛OS与阿里云DDNS打造高性价比个人云存储 你是否曾为家中堆积的旧电子设备感到困扰&#xff1f;那些性能落后但依然能正常运行的旧笔记本&#xff0c;其实蕴藏着巨大的实用价值。本文将带你探索如何将这些被时代淘汰的硬件变废为宝&#xff0c…...

SerialMP3库:GD3300D/TD5580A串口MP3模块驱动详解

1. SerialMP3 库概述&#xff1a;面向 GD3300D/TD5580A 串口 MP3 播放模块的嵌入式驱动框架SerialMP3 是一个专为基于 GD3300D 或 TD5580A 音频解码芯片的串口 MP3 播放板设计的 Arduino 兼容库。该库并非通用音频处理中间件&#xff0c;而是一个硬件协议抽象层&#xff08;Har…...

Qwen3-VL-8B-Instruct-GGUF效果分享:100张用户实测图平均响应时间<1.8s(A10 GPU)

Qwen3-VL-8B-Instruct-GGUF效果分享&#xff1a;100张用户实测图平均响应时间<1.8s&#xff08;A10 GPU&#xff09; 1. 模型效果实测&#xff1a;速度与精度的双重惊喜 当我第一次看到Qwen3-VL-8B-Instruct-GGUF的测试结果时&#xff0c;确实被惊艳到了。这个模型在A10 G…...

让幻想更真实:Kook Zimage真实幻想Turbo负面提示词使用指南

让幻想更真实&#xff1a;Kook Zimage真实幻想Turbo负面提示词使用指南 1. 为什么负面提示词如此重要 在AI图像生成领域&#xff0c;我们常常把注意力放在如何写好正面提示词上&#xff0c;却忽略了负面提示词的重要性。负面提示词就像一位隐形的编辑&#xff0c;默默剔除那些…...

突破学术写作瓶颈:WPS-Zotero革新文献管理工作流

突破学术写作瓶颈&#xff1a;WPS-Zotero革新文献管理工作流 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 在学术写作的征途上&#xff0c;文献管理如同隐形的绊脚石&…...

5个高效能的LabelImg图像标注效率提升实践

5个高效能的LabelImg图像标注效率提升实践 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Studio, the open s…...