c语言中的柔性数组

目录

1.柔性数组的特点

2.柔性数组的创建和简单使用

3.柔性数组的优势


何为柔性数组(Flexible Array)

柔性数组在C语言的 C99 标准中,引入的新特性。结构中的最后一个元素的大小允许是未知的数组,即为柔性数组。

复制代码
struct S {
	int i;

	int arr[];   //柔性数组成员

	/*int arr[0];*/ //这两种写法都可以,具体看编译器
};

1.柔性数组的特点

  • 柔性数组不能单独的出现在结构体之中,至少要包含一个及以上其它成员,且要在末尾
  • 利用sizeof计算的结构体大小,并不会去计算柔性数组的大小
  • 包含柔性数组成员的结构体要利用malloc来进行动态内存分配,且分配的内存大小要大于结构体内存大小,来达到预期的所需内存的大小。

2.柔性数组的创建和简单使用

创建

复制代码
struct S {
	int i;

	int arr[];  
};
int main() {

	struct S *s = (struct S*)malloc(sizeof(struct S)+5*sizeof(int));
//使用malloc创建了一个大小为:       (结构体本身大小) + 柔性数组你所期望的大小

    struct S *s = (struct S*)malloc(sizeof(struct S)+10*sizeof(int));
                                                 //调整柔性数组大小
	return 0;
}

这就是为什么柔性数组为什么要在成员末尾的原因,只有它在末尾,开辟内存的大小变化时,柔性数组的大小才会随着变化,这就是所谓的柔性数组

简单使用

代码一

复制代码
struct S {
	int i;

	int arr[];  
};
int main() {

	struct S *p = (struct S*)malloc(sizeof(struct S)+5*sizeof(int));
    if(p == NULL)
    return 1;

	//业务处理
	p->i = 100;
	for (int i = 0; i < 100; i++)
	{
		p->arr[i] = i;
	}

	//释放空间
	free(p);
	p = NULL;

	return 0;
}

3.柔性数组的优势

在上柔性数组的简单使用中,我们的代码换种写法也可以达到跟柔性数组一样的功能

把柔性数组成员换成:指针变量

代码二

复制代码
struct S {
	int i;

	int *parr;
};
int main() {

	struct S* p = (struct S*)malloc(sizeof(struct S));
	if (p == NULL)
		return 0;

	p->parr = (int*)malloc(5 * sizeof(int));//多一次malloc就必然要多一次检查和内存释放
	if (p->parr == NULL)                         
		return 0;

	//业务处理
	p->i = 100;
	for (int i = 0; i < 100; i++)
	{
		p->parr = i;
	}

	//释放空间
	free(p->parr);  //得先释放结构体成员parr所指向的空间
	p->parr = NULL;
	free(p);        //在释放p,若顺序弄错造成内存泄露
	p->parr = NULL;

	return 0;
}

说白了就是利用结构体里的指针paar再去开辟一块动态内存空间

代码一比代码二优势的地方在于:

优势 1 :方便内存释放

使用了较少次的malloc,这样使后面的内存释放得到了方便,且也不容易造成内存泄漏

优势 2 :提升性能


连续的内存有益于提⾼访问速度,也有益于减少内存碎⽚。

相关推荐
Aurorar0rua6 分钟前
CS50 x 2024 Notes Memory - 03
c语言·开发语言·学习方法
捷瑞电子工坊10 小时前
嵌入式秋招面经:5大核心模块高频考题与实战避坑总结
c语言·stm32·嵌入式工程师·rtos·通信协议·嵌入式面试
天空'之城12 小时前
C 语言工业级通用组件手写 30:安全内存拷贝组件
c语言·内存拷贝·工业级组件·安全内存操作
LuminousCPP13 小时前
数据结构-双向循环链表
c语言·数据结构·笔记·链表
小僧景贤15 小时前
嵌入式C语言 第二篇:基础语法|嵌入式C与标准C的核心差异
c语言·开发语言·嵌入式c语言
wuyk55518 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
LuminousCPP19 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
带鱼吃猫19 小时前
预处理器:宏、运算符与条件编译
c语言·开发语言
(Charon)20 小时前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++
SunnyByte20 小时前
排序进阶:快速排序与归并排序的迭代实现,并与递归版本对比
c语言·数据结构·算法·排序算法