C语言柔性数组详解

目录

1.柔性数组

2.柔性数组的特点

3.柔性数组的使用

4.柔性数组的优势


1.柔性数组

C99 中,结构体中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。 例如:

复制代码
struct S
{
	char c;
	int n;
	int arr[];//柔性数组
};

struct S
{
	char c;
	int n;
	int arr[0];//柔性数组
};

有些编译器支持a[0]这种写法,有些编译器支持a[ ]这种写法,具体取决于编译器。


2.柔性数组的特点

  • 结构体中的柔性数组成员前面必须至少有一个其他成员
  • sizeof 返回的这种结构大小不包括柔性数组的内存
  • 包含柔性数组成员的结构用malloc 函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。

例如:

复制代码
#include<stdio.h>
struct S
{
	int n;
	int arr[0];//柔性数组
};
int main()
{
	printf("%zd\n", sizeof(struct S));
	return 0;
}

运行结果:


3.柔性数组的使用

代码1:结构体里放数组

复制代码
#include<stdio.h>
#include<stdlib.h>
struct S
{
	int n;
	int arr[0];//柔性数组
};
int main()
{
	//期望数组可以存放5个元素
	struct S* ps=(struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
	if (ps == NULL)
	{
		perror("malloc");
		return 1;
	}
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	//调整空间
    //期望数组可以存放10个元素
	struct S* ptr=(struct S*)realloc(ps, sizeof(struct S) + 10 * sizeof(int));
	if (ptr != NULL)
	{
		ps = ptr;
	}
	//使用
	//释放
	free(ps);
	ps = NULL;
	return 0;
}

通过realloc函数调整空间使数组变大变小,从而使柔性的特点更加鲜明,也不难想到它放在结构体中最后一个元素的原因。

内存窗口:


4.柔性数组的优势

代码2:结构体里放指针

复制代码
#include<stdio.h>
#include<stdlib.h>
struct S
{
	int n;
	int* arr;
};
int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	if (ps == NULL)
	{
		perror("malloc");
		return 1;
	}
	ps->arr =(int*) malloc(5 * sizeof(int));
	if (ps->arr == NULL)
	{
		perror("malloc");
		return 1;
	}
	//使用
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	//调整数组大小
	int*ptr =(int*)realloc(ps->arr, 10 * sizeof(int));
	if (ptr != NULL)
	{
		ps->arr = ptr;
	}
	//使用
	//释放  注意:释放两块空间的先后顺序!
	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

注意:释放两块空间的先后顺序!如果先释放ps指向的内存空间,就找不到arr的值了,导致arr指向的内存空间无法释放。所以,要先释放arr指向的数组,再释放ps指向的内存。
上述代码1和代码2可以完成同样的功能,但是代码1的实现有
两个好处

1.方便内存释放

代码2里面做了二次内存分配,结构体内的成员也需要free,用户需要做两次free把内存释放掉,并且需要注意释放内存的顺序,而代码1用户做一次free 就可以把所有的内存给释放掉。

2.有利于提高访问速度

连续的内存有益于提高访问速度,也有益于减少内存碎片


相关推荐
YuforiaCode7 分钟前
第十五届蓝桥杯 2024 C/C++组 拼正方形
c语言·c++·蓝桥杯
啊阿狸不会拉杆9 分钟前
数据结构-图
java·c语言·数据结构·c++·python·算法·图论
Msshu12324 分钟前
诱骗协议芯片支持PD2.0/3.0/3.1/PPS协议,支持使用一个Type-C与电脑传输数据和快充取电功能
c语言·开发语言·电脑
双叶8361 小时前
(51单片机)LCD展示动画(延时函数)(LLCD1602教程)
c语言·数据库·c++·单片机·嵌入式硬件·51单片机
刃神太酷啦2 小时前
堆和二叉树--数据结构初阶(3)(C/C++)
c语言·数据结构·c++·算法·leetcode·深度优先·宽度优先
良木林2 小时前
240424 leetcode exercises II
c语言·数据结构·算法·leetcode
啊阿狸不会拉杆3 小时前
数据结构-排序
java·c语言·数据结构·c++·python·算法·排序算法
whoarethenext3 小时前
加密认证库openssl初始附带c/c++的使用源码
c语言·网络·c++·openssl
User_芊芊君子3 小时前
【C语言经典算法实战】:从“移动距离”问题看矩阵坐标计算
c语言·算法·矩阵
阿让啊16 小时前
单片机获取真实时间的实现方法
c语言·开发语言·arm开发·stm32·单片机·嵌入式硬件