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

C语言柔性数组详解与应用

目录

介绍什么是柔性数组

柔性数组有什么特点

柔性数组使用场景

模拟实现柔性数组

柔性数组的好处


介绍什么是柔性数组

柔性数组是C语言引入的一个新特性,在C99中我们把最后一个没有指明大小的数组叫做是柔性数组。

我们这里举一个栗子:

struct test {int size;int data[]; // 柔性数组成员
};

除此之外我们还有一个非C99标准定义的柔性数组:

struct test {int size;int data[0]; // 柔性数组
}

柔性数组有什么特点

1、大小不固定

柔性数组的大小在编译的阶段是无法确定的,需要到了运行的时候才动态地分配空间。

我们在使用sizeof的时候是不包括柔性数组的:

#include <stdio.h>struct test {int size;int data[];
};
int main() {printf("%d\n", sizeof(struct test)); // 这里的结果是4return 0;
}

2、出现在结构体的最后一个成员且至少有一个其他成员

如果不是有一个其他成员,代码会报错:

#include <stdio.h>struct test {int data[];
};

3、如果我们想使用柔性数组来存储数据,那么我们就需要开辟比原来结构体大的空间。

#include <stdio.h>struct test {int size;int data[];
};
int main() {struct test* p = (struct test*)malloc(sizeof(struct test) + 5 * sizeof(int));return 0;
}

柔性数组使用场景

我们通常是在要改变数组大小的情况下使用柔性数组的。

我们这里举一个例子,就是要求结构体的数组从存储0到4变成存储5到9:

#include <stdio.h>
#include <stdlib.h>
struct test {int size;int data[];
};
int main() {struct test* p = (struct test*)malloc(sizeof(struct test) + 5 * sizeof(int));p->size = 10;for(int i = 0; i < 5; i++) {p->data[i] = i;} struct test* tp = (struct test*)realloc(p, sizeof(struct test) + 10 * sizeof(int));if(tp != NULL) {p = tp;}for(int i = 5; i < 10; i++) {p->data[i] = i;}// 别忘了要释放开辟的空间^_^free(p);p = NULL;return 0;
}

模拟实现柔性数组

事实上,如果我们有了之前内存管理相关的知识储备,我们就可以自己实现上面的功能:

#include <stdio.h>
#include <stdlib.h>struct test {int size;int* data;
};
int main() {struct test* p = (struct s*)malloc(sizeof(struct test));p->data = (int*)malloc(5 * sizeof(int));p->size = 10;for(int i = 0; i < 5; i++) {p->data[i] = i;}int* tp = (int*)realloc(p->data, 10 * sizeof(int));if(tp != NULL) {p->data = tp;}for(int i = 5; i < 10; i++) {p->data[i] = i;}free(p->data);p->data = NULL;free(p);p = NULL;return 0;
}

其实柔性数组就是一种C语言提供灵活内存管理的特性,它允许我们在结果体内部定义一个大小不确定的数组,在运行的时候使用动态内存分配为结构体和数组分配内存,实际上它是为了给我们处理动态大小变化的数据提供一种便利的方式。

柔性数组的好处

1、方便释放内存

我们在上面模拟实现的时候也发现了,我们使用柔性数组只要释放一次内存,模拟的时候就需要两次而且还要注意到释放顺序的问题。

2、提高访问的速度

我们使用柔性数组的时候,内存中开辟的空间是连续的:

我们自己实现的就是下面这种情况了:

我们这里可以发现第一种情况的内存是连续的,而第二种就不是了,我们可以打印出来看看就知道了。

其实我们在考虑——连续和不连续又有什么影响呢?其实这里就涉及到了一个重要的概念,就是内存碎片

越多的不连续的内存分配就会产生越多的内存碎片,这样就会使得我们的内存利用率低下。

我们这里还有一个概念,就是CPU在存储器取数据的时候,会遵循局部性原理(计算机组成原理):也就是CPU在访问存储器的时候,无论是取数据还是指令,访问的内存单元往往都是聚集在了一个比较小的连续的空间中。所以,将相关联的数据存储在一起是会提高CPU的访问速度的。

http://www.dtcms.com/a/383140.html

相关文章:

  • 【C++】22. 封装哈希表实现unordered_set和unordered_map
  • ARM Cortex-M 中的 I-CODE 总线、D-CODE 总线和系统总线
  • HTML5和CSS3新增的一些属性
  • 用C语言打印乘法口诀表
  • Docker desktop安装Redis Cluster集群
  • 拼多多返利app的服务自动扩缩容策略:基于K8s HPA的弹性架构设计
  • 每日前端宝藏库 | Lodash
  • LeetCode 978.最长湍流子数组
  • Java连接电科金仓数据库(KingbaseES)实战指南
  • 2025 年 AI 与网络安全最新趋势深度报告
  • PDF发票提取工具快速导出Excel表格
  • 2. BEV到高精地图的全流程,本质上是自动驾驶**车端(车载系统上传bev到云端)与云端(云端平台处理这些bev形成高精地图)协同工作
  • Nature 子刊:儿童情绪理解的认知发展机制
  • git pull还是git pull -r?
  • 使用 LMCache + vLLM 提升 AI 速度并降低 GPU 成本
  • 快速排序:高效的分治排序算法
  • stap用法
  • 鸿蒙Next ArkWeb网页文件上传与下载完全指南
  • 云轴科技ZStack AI多语种翻译平台建设实践
  • Android SDK中关于BoardConfig.mk的宏定义继承和覆盖规则
  • 链表与数组
  • 【Python】字符串
  • 【Python】实现一个文件夹快照与比较工具
  • Python的深度学习
  • 自动化测试的概念
  • [QT]信号与槽
  • 高精度运算:大数计算全攻略
  • LeetCode 3302.字典序最小的合法序列
  • 深入解析3x3矩阵:列优先与行优先约定的全面指南
  • Codeforces 1049 Div2(ABCD)