前言
也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
前言
柔性数组
柔性数组的特点
柔性数组的使用
不使用柔性数组
柔性数组
如下代码int a[0]就是柔性数组
struct st_type
{
	int i;//柔性数组前面至少要有一个其他成员
	int a[0];//柔性数组成员
	//int a[];
};柔性数组的特点
- 结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
- sizeof返回的这种结构⼤⼩不包括柔性数组的内存。
- 包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

柔性数组的使用
- 使用柔性数组,只是用了一次malloc函数,有利于访问速度(相对而言),减少了内存碎片
- 把结构体的内存以及其成员要的内存⼀次性分配好,并返回⼀个结构体指针,⼀次free就可以把所有的内存也给释放掉。
struct st
{
	int a;
	int arr[];
};
int main()
{//用结构体指针变量ps接收malloc函数分配空间的地址
	struct st*ps=(struct st*)malloc(sizeof(struct st) + 10 * sizeof(int));
	//              malloc分配空间的大小是 结构体大小+40字节 (40字节是分配给柔性数组的)
	//判断
	if (ps == NULL)
	{
		return 1;
	}
	//使用
	ps->a = 100;
	for (int i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	//若数组空间不够
	//用realloc函数重新分配
	struct st*ptr=(struct st*)realloc(ps,sizeof(struct st) + 15 * sizeof(int));
	if (ptr != NULL)
	{
		ps = ptr;//再次赋值给ps
	}
	else
	{
		perror("realloc");
	}
	//继续使用
	for (int i = 0; i < 15; i++)
	{
		ps->arr[i] = i;
	}
	//打印
	for (int i = 0; i < 15; i++)
	{
		printf("%d ",ps->arr[i]);
	}
	//释放
	free(ps);
	ps = NULL;
	return 0;
}对比 不使用柔性数组
不使用柔性数组实现同样功能,就要多次使用malloc函数开辟空间
#include <stdio.h>
#include<stdlib.h>
struct st
{
	int a;
	int* arr;
};
int main()
{//用结构体指针变量ps接收malloc函数分配空间的地址
	struct st* ps = (struct st*)malloc(sizeof(struct st));
	//判断
	if (ps == NULL)
	{
		return 1;
	}
	//使用
	ps->a = 100;
	//再次使用malloc函数给数组arr开辟空间
	ps->arr = (int*)malloc(10 * sizeof(int));
	if (ps->arr == NULL)
	{
		perror("malloc-2");
		return 1;
	}
	//使用
	for (int i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	//数组空间不够
	// 利用realloc函数扩大
	int* ptr = (int*)realloc(ps->arr, 15 * sizeof(int));
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	else
	{
		ps->arr = ptr;
	}
	//初始化前15个元素
	for (int i = 0; i < 15; i++)
	{
		ps->arr[i] = i;
	}
	
	//打印
	for (int i = 0; i < 15; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	//释放
	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}



















