柔性数组
柔性数组是啥?
柔性数组,也叫做0长度数组,主要用途是为了满足改变长度的结构体
如何使用呢?
若要使结构体可变长度,在一个结构体最后申明一个长度为0的数组即可。对于编译器来说,这个长度为0的数组并不占用空间(数组名本身不占据空间,但代表了一个不可更改的地址常量)。
struct S
{
int a;
short b;
char c;
char p[];//结构体中不能只存在数组,前面需要有其他成员
};
我们通过动态分配来处理数组的大小问题
(若是通过
malloc() calloc()
等方法分配空间,需释放空间)
优点:
- 柔性数组相对于在结构体中声明一个指针变量再进行动态分配的方法,效率更高,因为访问数组内容时避免了两次访存。
- 分配连续内存,减少内存碎片化(因为指针分配的空间不是连续的,数组占用的空间是连续的)
看一段代码来帮助理解
#include<stdio.h>
struct S
{
int a;
short b;
char c;
char d[];
};
int main()
{
//开辟空间
struct S* p = (struct S*)malloc(sizeof(struct S) + 10);//预留十个字节
if(p == NULL)
{
perror("error!");
return 1;
}
//扩容
struct S* ptr = (struct S*)realloc(p,sizeof(struct S) + 20);
if(ptr == NULL)
{
perror("error!");
return 1;
}
p = ptr;
//使用
//......
//释放
free(p);
p = NULL;
return 0;
}