柔性数组【结构体和动态内存的结合】

全文目录

  • 前言
  • 柔性数组的定义语法
  • 柔性数组的特点
  • 柔性数组的使用
  • 柔性数组的优势

前言

很多人可能没有听过柔性数组这个概念,但是在C99中柔性数组是确实存在的。我个人感觉有点像动态内存和结构体的结合。

柔性数组的定义语法

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

定义:

typedef struct st_type
{
	int i;
	int a[0]; 	//柔性数组成员
} type_a;

可能在有的编译器下上面的语法会报错,可以改成:

typedef struct st_type
{
	int i;
	int a[]; 	//柔性数组成员
} type_a;

柔性数组的特点

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

我们可以看看没有给柔性数组的分配空间的时候结构体的大小是多少

typedef struct st_type
{
	int i;
	int a[0];	//柔性数组成员
} type_a;

printf("%d\n", sizeof(type_a));		//输出的是4

运行起来可以可以看到只有4字节,说明结构体的大小没有包括柔性数组的大小

柔性数组【结构体和动态内存的结合】_第1张图片

柔性数组的使用

话不多说,直接上代码,只需要开辟多于结构体大小的空间,多出来的空间就是柔性数组的。

// 代码一
int i = 0;
type_a *p = (type_a*)malloc(sizeof(type_a) + 100 * sizeof(int));

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

上述代码相当于获得了一个100个整型大小的数组空间。

柔性数组的优势

柔性数组,既然是数组可能就可以通过指针来实现,柔性数组的功能同样可以用下面的代码来实现

// 代码二
typedef struct st_type
{
	int i;
	int *p_a;
} type_a;

type_a *p = (type_a *)malloc(sizeof(type_a));
p->i = 100;
p->p_a = (int *)malloc(p->i*sizeof(int));

//业务处理
for(i=0; i<100; i++)
{
	p->p_a[i] = i;	
}
//释放空间
free(p->p_a);
p->p_a = NULL;
free(p);
p = NULL;

但是柔性数组有以下两种优势

1. 方便内存释放

代码二中的空间需要申请两次,同样的也需要释放两次,而柔性数组只需要申请一次,释放一次,使用起来比代码二更加的方便。

2. 有利于访问速度

代码二中申请了两次空间,说明其申请的空间不一定是连续的,那么访问起来就比柔性数组更慢,因为柔性数组只申请了一次空间,空间是连续的,并且这样还能减少空间碎片。

你可能感兴趣的:(C语言,柔性数组,java,开发语言)