柔性数组

目录

概念:

柔性数组的要求:

柔性数组特点:

特点2举例: 

特点3举例:

柔性数组再次调整变大:

 奇怪的写法——不使用柔性数组:

 从上述代码得知柔性数组的好处:



概念:

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。

typedef struct st_type
{int i;int a[];//柔性数组成员
}type_a;或者typedef struct st_type
{int i;int a[0];//柔性数组成员
}type_a;

 从来没有数组的大小是0,而int a[0]是语法要求,表示数组的大小是未知的。

柔性数组的要求:

  1. 必须是结构体内部的数组
  2. 这个数组必须是最后一个成员
  3. 这个数组一定要是未知大小的数组

注意:因为必须是最后一个,在柔性数组前面一定要有结构体的其他成员 

柔性数组特点:

  1. 结构中的柔性数组成员前面必须至少一个其他成员
  2. sizeof 返回的这种结构大小不包括柔性数组的内存
  3. 包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

特点2举例: 

struct st_type
{int i;int a[];//柔性数组成员
};int main()
{printf("%d\n",sizeof(struct st_type));return 0;
}

结果:

 

特点3举例:

struct st_type
{int i;int a[];//柔性数组成员
};int main()
{int i = 0;st_type *p = (st_type*)malloc(sizeof(st_type)+100*sizeof(int));p->i = 100;for(i=0; i<100; i++){p->a[i] = i;}free(p);return 0;
}

 注意,int i =0 是循环的,而p->i=100是指结构体成员i

st_type*p = (st_type*)malloc(sizeof(st_type)+100*sizeof(int));

  • 算出第一个成员的大小,在加上想要设置给柔性数组的大小。
  • 又因为这二者是在给结构体成员开辟空间,相当于给结构体开辟空间,所以强制转化为结构体的指针类型,并且交给该结构体指针。

图例: 

 

注意事项:使用malloc的时候,开辟的空间一定要比结构体的大小还要大,这也是在malloc中同时要加上其他结构体成员大小一起开辟的原因。 

柔性数组再次调整变大:

struct st_type* ptr = (struct st_type*)realloc(p, sizeof(struct st_type)+15*sizeof(int));if (ptr != NULL)
{p = ptr;ptr = NULL;
}
return 0;

别忘记前面成员的大小需要保留 

 奇怪的写法——不使用柔性数组:

struct st_type
{int i;int *p_a;
}type_a;int main()
{type_a *p = (type_a *)malloc(sizeof(type_a));p->i = 100;p->p_a = (int *)malloc(p->i*sizeof(int));for(i=0; i<100; i++){p->p_a[i] = i;}//释放空间free(p->p_a);p->p_a = NULL;free(p);p = NULL;return 0;
}

 从上述代码得知柔性数组的好处:

第⼀个好处是:

⽅便内存释放 如果我们的代码是在⼀个给别⼈⽤的函数中,你在⾥⾯做了⼆次内存分配,并把整个结构体返回给⽤ ⼾。

⽤⼾调⽤free可以释放结构体,但是⽤⼾并不知道这个结构体内的成员也需要free,所以你不能 指望⽤⼾来发现这个事。

所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返 回给⽤⼾⼀个结构体指针,⽤⼾做⼀次free就可以把所有的内存也给释放掉。

第⼆个好处是:

这样有利于访问速度. 连续的内存有益于提⾼访问速度,也有益于减少内存碎⽚。(其实,我个⼈觉得也没多⾼了,反正你 跑不了要⽤做偏移量的加法来寻址)。

利于访问的原理是:

  • 柔性数组开辟是连续的,这种方法不是连续的,不能一次性将结构体内部的成员全部访问。
  • 而且这种写法相当于在内存中开辟多个空间,并且频繁进行malloc会导致堆区很多地方剩下的空间像碎片一样,被浪费,空间利用率降低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/138735.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PHP的短视频SEO矩阵系统源码开发

随着短视频市场的爆发式增长&#xff0c;越来越多的企业开始寻求在短视频领域建立自己的品牌形象&#xff0c;增加用户粘性和获取更多流量。为此&#xff0c;一套高效的短视频SEO矩阵系统源码显得尤为重要。本文将介绍基于PHP语言的短视频SEO矩阵系统源码开发&#xff0c;帮助读…

2023-09-18 LeetCode每日一题(打家劫舍 III)

2023-09-18每日一题 一、题目编号 337. 打家劫舍 III二、题目链接 点击跳转到题目位置 三、题目描述 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦…

【收藏】如何最快取得NISP二级和CISP

【收藏】如何最快取得NISP二级和CISP &#x1f449;今天小编来给大家讲解一下如何最快的取得NISP二级和CISP证书 ✅我们从如下几个方面为大家讲解&#xff1a; &#x1f53a;报名条件 &#x1f53a;考试形式 &#x1f53a;考试题型 &#x1f53a;如何备考 &#x1f53a;证书用途…

SkipList跳表

SkipList&#xff0c;跳表&#xff0c;是一种有序的数据结构&#xff0c;可以作为平衡树的一种替代。本质上是一种利用稀疏索引加速链表查询的一组数据索引的结构。 平衡树一般指BST和 红黑树等数据结构&#xff0c;这种数据结构解决了 排序树的不平衡问题&#xff0c;但带来了…

RabbitMQ 消息应答

每日一句 物是人非事事休,欲语泪先流。 概述 为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制, 消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。 自动应答 消息发送后立即被认为已经传送成功,这种模式需要在…

VB求平均值

VB求平均值 Private Function pj(x() As Integer) As SingleDim m%, n%, i%, s%m LBound(x): n UBound(x)For i m To ns s x(i)Next ipj s / (n - m 1) End Function Private Sub Command1_Click()Dim a%(1 To 10), i%, aver!For i 1 To 10a(i) Int(Rnd() * 10) 随机…

安装Anaconda与pytorch,在IDEA中配置环境进行编程

1.官网下载与自己python版本匹配的Anaconda(注意&#xff0c;要想成功安装pytorch&#xff0c;python版本也要对应pytorch的相关版本) Anaconda官网最新版本 与自己python版本不否请查找自己版本anaconda版本对应 清华大学镜像下载 2.安装时勾选添加环境变量或者手动添加&am…

CMD脚本实战教程

要在 Windows 11 上编写一个自定义关机的 CMD 脚本文件&#xff0c;你可以创建一个扩展名为 .bat 或 .cmd 的文本文件&#xff0c;并在其中编写脚本。 一、常用语法 rem&#xff1a;注释 pause&#xff1a;暂停正在执行的批处理文件&#xff0c;并提示用户按键之后继续执行 r…

【数模研赛思路】2023华为杯研究生数学建模竞赛选题建议及CDEF题思路

大家好呀&#xff0c;全国研究生数学建模竞赛今天早上开赛啦&#xff0c;在这里先带来初步的选题建议及思路。 目前团队正在写E题完整论文&#xff0c;此外C已经完成了第一问代码及结果&#xff0c;本文章只是一个比较粗略的文字版思路&#xff0c;更加详细的半小时视频讲解版…

Windows AD 组策略 安全加固

一、密码策略 &#xff08;1&#xff09;Enforce password history&#xff08;强制密码历史&#xff09; &#xff08;2&#xff09;aximum password age&#xff08;密码最长使用期限&#xff09; &#xff08;3&#xff09;Minimum password age&#xff08;密码最短使用期限…

基于微信小程序的校园生活管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境学生微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝1…

浅谈终端安全接入

前言&#xff1a; 随着网络的发展&#xff0c;现代企业大多都会部署企业的有线网络与无线网络&#xff0c;在传统的企业网内&#xff0c;随着越来越多的终端设备接入到公司网络&#xff0c;管理人员控制和审计外部用户接入的企业办公网的难度和工作量也越来越大。而如果允许外…

图的十字链表存储结构

1.其实就是邻接表和逆邻接表的结合&#xff0c;说明白点&#xff0c;就是用箭头表示出弧头&#xff0c;弧尾&#xff0c;以及他们之间的关系 2.顶点结构 3.弧结构 3.这样根据上面的结点十字链表结构就很好分析了

东莞建筑模板批发供应商

东莞作为中国著名的制造业城市&#xff0c;建筑业一直是该地区的重要支柱产业。在建筑施工中&#xff0c;建筑模板是不可或缺的关键材料之一。为满足市场需求&#xff0c;东莞拥有众多专业的建筑模板批发供应商&#xff0c;他们以丰富的经验、优质的产品和专业的服务赢得了客户…

Python练习之列表

1、输入一个包含若干整数的列表&#xff0c;输出新列表&#xff0c;要求新列表中的所有元素来自于输入的列表&#xff0c;并且降序排列。 ainput("输入列表元素&#xff1a;") itema.split(" ") list[eval(x) for x in item] list.sort(keyNone,reverseTr…

人脸修复祛马赛克算法CodeFormer——C++与Python模型部署

一、人脸修复算法 1.算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发&#xff0c;它能够接收模糊或马赛克图像作为输入&#xff0c;并生成更清晰的原始图像。算法源码地址&#xff1a;https://github.c…

2023-2024年最新大数据学习路线

文章目录 2023-2024年最新大数据学习路线大数据开发入门*01*阶段案例实战 大数据核心基础*02*阶段案例实战 千亿级数仓技术*03*阶段项目实战 PB级内存计算04阶段项目实战 亚秒级实时计算*05*阶段项目实战 大厂面试*06* 2023-2024年最新大数据学习路线 新路线图在Spark一章不再…

软考复习 -- 计算机网络

1 网络互连设备 物理层&#xff1a;中继器和集线器&#xff08;多路中继器&#xff09;数据链路层&#xff1a;网桥和交换机&#xff08;多端口网桥&#xff09;网络层&#xff1a;路由器应用层&#xff1a;网关 2 广播域和冲突域 3 协议簇 4 网际层协议 4 TCP和UDP 4.1 TC…

打开常用软件出现msvcp140.dll丢失的解决方法,msvcp140.dll是什么东西?

在我们使用计算机的过程中&#xff0c;有时候会遇到一些错误提示&#xff0c;其中“找不到 msvcp140.dll”就是比较常见的一种。那么&#xff0c;msvcp140.dll 到底是什么呢&#xff1f;为什么会出现找不到的情况&#xff1f;丢失 msvcp140.dll 又会对计算机产生什么影响&#…

腾讯Behaviac Designer 和Unity连调行为树

1. 克隆源码 https://github.com/Tencent/behaviac/ 2. 编译生成BehaviacDesigner.exe 3. 找到并打开BehaviacDesigner.exe&#xff08;先不急着填弹出的路径workspace 设置框&#xff09; 4. 新建一个Unity 空工程&#xff0c;并在此处下载behaviac unitypackage 5. Unity中…