数组----柔性数组

C99标准中,定义了一个关于数组的动态数组的概念,该数组可以根据实际需求来改变数组的长度,以实现柔性变化,这种数组也被称为柔性数组。

一.柔性数组的定义

在结构体中,最后一个元素为可变长度的数组,这个数组叫做柔性数组

cs 复制代码
struct Str
{
    int i;
    char x;
    int a[];//柔性数组
}type_a;

二.柔性数组的使用

需要遵循以下要求

1.柔性数组的前面必须有至少一个的其他成员;也就是说柔性数组不允许放在结构体成员的第一位

cs 复制代码
struct Str
{
    int a[];//不允许
    int b;
}

2.柔性数组所占用的空间不属于sizeof所筹定的范围

也就是说柔性数组需要额外分配内存空间。

3.柔性数组的大小必须是未指定的

由于动态分配的特性,指定了大小就属于静态分配。

4.包含柔性数组成员的结构应该malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小

三.实例

cs 复制代码
struct FlexArray 
{
	int length;
	int data[]; // 柔性数组
};

int main() 
{
	int size = 5;
	struct FlexArray *flex = malloc(sizeof(struct FlexArray) + size * sizeof(int));
	flex->length = size;
	for (int i = 0; i < size; i++) 
    {
		flex->data[i] = i * 2;
	}
	// 访问柔性数组中的元素
	for (int i = 0; i < flex->length; i++) 
    {
		printf("%d ", flex->data[i]);
	}
	free(flex);
	return 0;
}

在这个例子中,使用指针来访问柔性数组中的元素,从而实现对可变长度数组的操作。

并且相对于普通的动态分配,柔性数组有两个优点:

1.利于内存释放

由于动态分配是鉴于一个柔性数组所开辟的,并且柔性数组是结构体的一部分,那么当我们使用free来释放分配的空间时,一次性就可以实现,而不需要在函数中释放一次并在主函数中二次释放

2.加快运行速度

柔性数组鉴于存在于结构体中,所以动态分配的是一段连续的内存空间,这样就会使得内存更加紧凑,从而提高访问速度,减少碎片化的内存空间。

四.如何判断是否为柔性数组

查看结构体的定义,检查结构体中最后一个成员是否为一个未指定大小的数组;

计算结构体总大小,再减去其他成员的大小,查看是否等于柔性数组的大小。

相关推荐
懂点Tech4 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
徐小夕4 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao4 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
catchadmin5 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
念何架构之路5 小时前
go-grpc设计思想
开发语言·后端·golang
小豆庄5 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘565 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
酷炫码神6 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
careathers6 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
Elastic 中国社区官方博客6 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es