【C语言进阶:动态内存管理】柔性数组

news2025/1/20 3:48:32

本节重点内容:

  • 柔性数组的特点
  • 柔性数组的使用
  • 柔性数组的优势

⚡柔性数组

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

举例说明:

struct S
{
	int a;
	char c;
	int arr[];  //int arr[0]
};

⚡柔性数组的特点和使用

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

struct S
{
	int a;
	char c;
	int arr[];  //int arr[0]
};

int main()
{
	printf("%d\n", sizeof(struct S));
	struct S* ps = (struct S*)malloc(sizeof(struct S) + sizeof(int) * 10);
	if (ps == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i + 1;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
     //调整数组arr大小
	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + sizeof(int) * 20);
	if (ptr == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	else
	{
		ps = ptr;
	}
	//使用
	//……
	free(ps);
	ps = NULL;
	return 0;
}

运行结果如下:


⚡柔性数组的优势

使用结构体指针来进行模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>

struct S
{
	int a;
	char c;
	int* arr;
};

int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	if (ps == NULL)
	{
		perror("malloc\n");
		return 0;
	}
	int* ptr = (int*)malloc(sizeof(int)*10);
	if (ptr == NULL)
	{
		perror("malloc2\n");
		return 0;
	}
	else
	{
		ps->arr = ptr;
	}
	//使用
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i + 1;
	}
	//打印
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	/*对arr进行扩容*/
	ptr = (int*)realloc(ps->arr,sizeof(int) * 20);
	if (ptr == NULL)
	{
		perror("realloc\n");
		return 0;
	}
	else
	{
		ps->arr = ptr;
	}
	free(ptr);
	ptr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

使用柔性数组和结构体指针都可以完成同样的功能,两者之间的对比:

  • 柔性数组好处是:方便内存释放

malloc 一次,free 一次,容易维护空间,不容易出错。内存碎片就会减少,内存利用率就较高一些。

  • 结构体指针好处是:有利于访问速度

连续的内存有益于提高访问速度,也有益于减少内存碎片。但是 malloc 两次,free 两次,维护难度加大,容易出错。内存碎片就会增多,内存利用率就下降了。

 由于内存碎片比较小,在日后被利用的可能性就比较小。


感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。

98b76a6f4a9c4ca88fd93da1188ac6f9.gif

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java+ssm 社区超市网上商城果蔬(水果蔬菜)管理系统

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括超市果蔬管理系统的网络应用&#xff0c;在外国超市果蔬管理系统已经是很普遍的方式&#xff0c;不过国内的超市果蔬管理系统可能还处于起步阶段。超市果蔬管理系统具有果蔬管…

Flutter系列(八)搜索框详解

底部导航顶部导航图片列表的完整代码 Flutter系列&#xff08;四&#xff09;底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 目录 一、前言 二、搜索框实现方案 三、完整工程代码 1. 自定义的搜索框组件SearchAppBar search.dart 2. 搜索详情页 search…

Java岗五面阿里,终拿offer,原来面试官总喜欢问这些问题

一面 一面就做了一道算法题&#xff0c;要求两小时内完成&#xff0c;给了长度为N的有重复元素的数组&#xff0c;要求输出第10大的数。典型的TopK问题&#xff0c;快排算法搞定。 算法题要注意的是合法性校验、边界条件以及异常的处理。另外&#xff0c;如果要写测试用例&am…

v1.5宝可梦综合耐久最大化计算器

版本更新v1.5 链接&#xff1a;https://pan.baidu.com/s/1JseHNYnAqIuSpg5f3k6Hbw?pwd01gy 提取码&#xff1a;01gy 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 更新说明 1.增加了特性威吓、灾祸之鼎、灾祸之简 使用说明 1.种族值&#xff1a;查百科获取…

Jmeter5.1.1报错:java.net.BindException: Address already in use: connect

Jmeter5.1.1报错&#xff1a;java.net.BindException: Address already in use: connect 原因&#xff1a;从网上找到资料&#xff1a;端口占用 Windows提供给TCP/IP链接的端口为 1024-5000&#xff0c;并且要四分钟来循环回收它们&#xff0c;就导致我们在短时间内跑大量的请…

【数据库】学习数据库该了解的基本知识

前言 在学习数据库之前&#xff0c;我们先要明确&#xff0c;sql是编程语言&#xff1b;Oracle&#xff0c;Mysql&#xff0c;SQL Server这些是数据库软件&#xff0c;sql这个语言是运行在数据库软件上的&#xff08;就像Java运行在jvm上一样&#xff09; 1、常见的关系型数据库…

HAProxy的安装、详细配置与实际应用(MyCAT、RabbitMQ示例)

HAProxy的安装、配置与实际应用 HAProxyHAProxy概述下载编译安装配置启动验证配置RabbitMQ的HAProxy示例 HAProxy HAProxy概述 HAProxy&#xff08;High Availability Proxy&#xff09;是一款自由、快速、可靠的TCP/HTTP负载均衡软件&#xff0c;其最常见的用途是将客户端请求…

使用signapk工具给apk系统签名

使用signapk给apk系统签名&#xff1a; 1、准备signapk.jar文件 查找路径&#xff1a; .\out\host\linux-x86\framework\signapk.jar 2、platform.x509.pem 和 platform.pk8 查找路径&#xff1a; .\vendor\prima\customer\certificatekey\prima 3、重点&#xff1a;将sdk…

Mac的PATH环境变量及相关文件加载顺序详细解释

系统级变量 /etc/profile /etc/paths 用户级变量(前3个按照从前往后的顺序读取&#xff0c;如果~/.bash_profile文件存在&#xff0c;则后面的几个文件就会被忽略不读了&#xff0c;如果~/.bash_profile文件不存在&#xff0c;才会以此类推读取后面的文件。~/.bashrc没有上述…

数据结构 | 排序 - 总结

排序的方式 排序的稳定性 什么是排序的稳定性&#xff1f; 不改变相同数据的相对顺序 排序的稳定性有什么意义&#xff1f; 假定一个场景&#xff1a; 一组成绩&#xff1a;100&#xff0c;88&#xff0c;98&#xff0c;98&#xff0c;78&#xff0c;100&#xff08;按交卷顺序…

【数据结构】队列(循环队列和链队列)详细讲解各种操作

&#x1f38a;专栏【数据结构】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 图片来源网络&#xff0c;如果侵权&#xff0c;请联系我 目录 ⭐队…

爱智EdgerOS之深入解析离线下载任务

一、需求分析 在日常使用计算机的过程中&#xff0c;看到喜欢的资源不可避免地想把它下载到我们的设备上保存下来&#xff0c;比如图片&#xff0c;音视频资源&#xff0c;文档资源等&#xff0c;基于这种应用场景&#xff0c;现在来看看在爱智设备上可以如何实现呢&#xff1…

日撸 Java 三百行day33

文章目录 说明day33 图的广度优先遍历1.思路2.多个连通分量2 代码实现 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampled…

82.qt qml-2D粒子系统、粒子方向、粒子项(一)

由于粒子系统相关的类比较多, 所以本章参考自QmlBook in chinese的粒子章节配合学习: 由于QmlBook in chinese翻译过来的文字有些比较难理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 1.介绍 粒子模拟的核心是粒子系统(Partic…

ResNet残差网络

ResNet 目的 Resnet网络是为了解决深度网络中的退化问题&#xff0c;即网络层数越深时&#xff0c;在数据集上表现的性能却越差。 原理 ResNet的单元结构如下&#xff1a; 类似动态规划的选择性继承&#xff0c;同时会在训练过程中逐渐增大&#xff08;/缩小&#xff09;该…

数字图像基础【7】应用线性回归最小二乘法(矩阵版本)求解几何变换(仿射、透视)

这一章主要讲图像几何变换模型&#xff0c;可能很多同学会想几何变换还不简单嚒&#xff1f;平移缩放旋转。在传统的或者说在同一维度上的基础变换确实是这三个&#xff0c;但是今天学习的是2d图像转投到3d拼接的基础变换过程。总共包含五个变换——平移、刚性、相似、仿射、透…

尚融宝10-Excel数据批量导入

目录 一、数据字典 &#xff08;一&#xff09;、什么是数据字典 &#xff08;二&#xff09;、数据字典的设计 二、Excel数据批量导入 &#xff08;一&#xff09;后端接口 1、添加依赖 2、创建Excel实体类 3、创建监听器 4、Mapper层批量插入 5、Service层创建监听…

2023年,想要靠做软件测试获得高薪,我还有机会吗?

时间过得很快&#xff0c;一眨眼&#xff0c;马上就要进入2023年了&#xff0c;到了年底&#xff0c;最近后台不免又出现了经常被同学问道这几个问题&#xff1a;2023年还能转行软件测试吗&#xff1f;零基础转行可行吗&#xff1f; 本期小编就“2023年&#xff0c;入行软件测…

一文解决nltk安装问题ModuleNotFoundError: No module named ‘nltk‘,保姆级教程

目录 问题一&#xff1a;No module named ‘nltk‘ 问题二&#xff1a;Please use the NLTK Downloader to obtain the resource 下载科学上网工具 问题三&#xff1a;套娃报错 如果会科学上网&#xff0c;可以直接看问题三 问题一&#xff1a;No module named ‘nltk‘ Mo…

【微服务笔记16】微服务组件之Gateway服务网关基础环境搭建

这篇文章&#xff0c;主要介绍微服务组件之Gateway服务网关基础环境搭建。 目录 一、Gateway服务网关 1.1、什么是Gateway 1.2、Gateway基础环境搭建 &#xff08;1&#xff09;基础环境介绍 &#xff08;2&#xff09;引入依赖 &#xff08;3&#xff09;添加路由配置信…