柔性数组的概念
C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员
柔性数组语法形式:
struct S
{
int a;
int arr[0];//这里的arr[0]代表未知大小的数组
};
//或者如下写法:
struct S
{
int a;
int arr[];
};
柔性数组的特点
- 结构体中的柔性数组成员前面必须至少一个其他成员
struct S
{
int a;
int arr[];
};
柔性数组必须最少有二个成员,柔性数组必须是最后一个成员
上面的第一种在某些编译器可能编译不过去,可以改成第二种方法
- sizeof 返回的这种结构大小不包括柔性数组的内存。
用 sizeof
计算大小时,是不会计算柔性数组的
- 包含柔性数组成员的结构用
malloc ()
函数进行内存的动态分配
并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小
柔性数组的使用
typedef struct s
{
int n;
int arr[];
}s;
int main()
{
s* pd = malloc(sizeof(s) + 40);
pd->n = 100;
int i = 0;
for (i = 0; i < 10; i++)
{
pd->arr[i] = i;
printf("%d ", pd->arr[i]);
}
}
代码结果:
- 以上代码是用柔性数组的方式给 arr 分配空间再打印
给 arr 分配 40 给字节的空间
柔性数组的优点
使用指针方式:
typedef struct s
{
int n;
int* arr;
}s;
int main()
{
s* pd = malloc(sizeof(s));//给成员n开辟空间
pd->n = 100;
pd->arr = malloc(40);//给成员 arr 开辟空间
if (pd->arr == NULL)
{
return 1;
}
//使用
int i = 0;
for (i = 0; i < 10; i++)
{
pd->arr[i] = i;
printf("%d ", pd->arr);
}
//释放
free(pd);//释放的是 n 成员
free(pd->arr);
pd = NULL;
return 0;
}
-
从上面代码和柔性数组的代码对比可以看出,柔性数组的代码更加的方便一些,只需
malloc
一次
而通过指针的方式实现需要malloc
二次,而且要多次释放,很是麻烦 -
柔性数组的优点:
1.方便内存释放
写代码在里面做了二次malloc
内存分配,并把整个结构体返回时,在进行free
进行释放时,可能会忘记释放结构体的其他成员
所以我们应该把结构体的内存以及其成员要的内存一次性分配好,做一次free
就可以把所有的内存也给释放掉
2.减少内存碎片化
过多的使用 动态内存函数会使的内存碎片化,会造成空间的浪费,会降低访问的速度