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

【C语言进阶】柔性数组

学习了动态内存管理和结构体之后,我们可以开始学习柔性数组~

目录

1.  什么是柔性数组

2.柔性数组的特点

2.1 柔性数组两种开辟空间的方式


1.  什么是柔性数组

        在结构体中的最后一个成员是一个没有指定大小的数组,那么这个数组叫做柔性数组。

typedef struct st_type
{int i;int a[0]; // 柔性数组成员
};typedef struct st_type
{int i;int a[]; // 编译不通过可以将0去掉
};

2.柔性数组的特点

柔性数组具有以下特点:

        ①结构体中的柔性数组之前必须至少有一个其他成员。

        ②sizeof返回的结构体大小不包含柔性数组的内存。

        ③包含柔性数组的结构体用malloc函数进行内存的动态分配,分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。

        最后一点是什么意思呢,我们可以看下面的图片,我们使用malloc创建结构体变量,除了结构体本身的4个字节,我们还需要给柔性数组分配40个字节的变量,这里将返回的地址给了ps,内存布局如下图所示:

2.1 柔性数组两种开辟空间的方式

        由于arr数组是由malloc分配的堆空间,所以这里可以使用relloc进行扩容。,如下图所示,我们又增加了80个字节,当然开辟完毕之后需要判断是否为空指针。

struct S 
{int n;int* arr;
};int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);ps -> n = 100;for(int i = 0;i < 10; i++){ps->arr[i] = i;}struct S* ptr = (struct S*)realloc(ps,sizeof(struct S) + 80);if(ptr != NULL){ps = ptr;}return 0;
}

        当使用完毕之后,我们只需要进行手动释放即可。

         除了想上面那样直接一次开辟空间,我们还可以多次开辟空间达到效果;

struct S 
{int n;int* arr;
};int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S));if(ps == NULL){return 1;}ps -> n= 100;ps ->arr =  (int*)malloc(40);if(ps -> arr == NULL){return 1;}for(int i  = 0;i < 10;i++){ps->arr[i] = i;} // 释放free(ps->arr); free(ps);ps = NULL;  
}

        需要注意的是,arr和结构体是分别开辟空间的,结构体包含arr,所以释放的时候先释放arr,再释放结构体;如果先释放结构体,那么arr就找不到了。

        那么这两种开辟空间的方式哪一种更好呢?第一种方案需要开辟、释放一次空间,第二种方案需要开辟、释放空间两次,后者更容易发生内存泄露,当malloc次数过多,那么内存碎片的数量就会越多,内存利用率会降低;换言之连续的内存存储有利于提高访问速度,减少内存碎片,提高内存利用率。

http://www.xdnf.cn/news/1177651.html

相关文章:

  • 【自动化测试】JMeter+Jenkins自动化接口与性能测试环境部署指南
  • Jenkins最新版本的安装以及集成Allure生成测试报告
  • 【并集查找】P4380 [USACO18OPEN] Multiplayer Moo S|省选-
  • 【Java】空指针(NullPointerException)异常深度攻坚:从底层原理到架构级防御,老司机的实战经验
  • 云祺容灾备份系统AWS S3对象存储备份与恢复实操手册
  • 碳油 PCB 技术解析:高精度制造与多场景应用实践
  • 如何借助AI工具?打赢通信设备制造的高风险之战?(案例分享)
  • docker安装 Elasticsearch、Kibana、IK 分词器
  • langchain+本地embedding模型+milvus实现RAG
  • 开源项目XBuilder前端框架
  • GoLand 项目从 0 到 1:第二天 —— 数据库自动化
  • OSPF路由协议单区域
  • JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
  • OSPF开放式最短路径优先
  • 大模型回复数据标注优化方案
  • DigitalOcean 一键模型部署,新增支持百度开源大模型ERNIE 4.5 21B
  • uni-app小程序云效持续集成
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-15,(知识点:DC-DC电源,BUCK电路,铁损,铜损)
  • 循环神经网络--LSTM模型
  • 【华为机试】1208. 尽可能使字符串相等
  • 面试题(技术面+hr面)
  • 第五章 Freertos物联网实战 微信小程序篇
  • 进阶向:基于Python的轻量级Markdown笔记管理器
  • DPO:大语言模型偏好学习的高效方案
  • 5G-RAN与语义通信RAN
  • 4种灵活的方法从POCO手机中删除联系人
  • easyexcel流式导出
  • 网络测试工具
  • 在vue3中watch和watchEffect的区别
  • Windows下使用UIAutomation技术遍历桌面窗口和指定窗口内容的AutomationWalker.exe的C#源代码