C99标准中,定义了一个关于数组的动态数组的概念,该数组可以根据实际需求来改变数组的长度,以实现柔性变化,这种数组也被称为柔性数组。
一.柔性数组的定义
在结构体中,最后一个元素为可变长度的数组,这个数组叫做柔性数组
struct Str { int i; char x; int a[];//柔性数组 }type_a;
二.柔性数组的使用
需要遵循以下要求
1.柔性数组的前面必须有至少一个的其他成员;也就是说柔性数组不允许放在结构体成员的第一位
struct Str { int a[];//不允许 int b; }
2.柔性数组所占用的空间不属于sizeof所筹定的范围
也就是说柔性数组需要额外分配内存空间。
3.柔性数组的大小必须是未指定的
由于动态分配的特性,指定了大小就属于静态分配。
4.包含柔性数组成员的结构应该malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小
三.实例
struct FlexArray { int length; int data[]; // 柔性数组 }; int main() { int size = 5; struct FlexArray *flex = malloc(sizeof(struct FlexArray) + size * sizeof(int)); flex->length = size; for (int i = 0; i < size; i++) { flex->data[i] = i * 2; } // 访问柔性数组中的元素 for (int i = 0; i < flex->length; i++) { printf("%d ", flex->data[i]); } free(flex); return 0; }
在这个例子中,使用指针来访问柔性数组中的元素,从而实现对可变长度数组的操作。
并且相对于普通的动态分配,柔性数组有两个优点:
1.利于内存释放
由于动态分配是鉴于一个柔性数组所开辟的,并且柔性数组是结构体的一部分,那么当我们使用free来释放分配的空间时,一次性就可以实现,而不需要在函数中释放一次并在主函数中二次释放
2.加快运行速度
柔性数组鉴于存在于结构体中,所以动态分配的是一段连续的内存空间,这样就会使得内存更加紧凑,从而提高访问速度,减少碎片化的内存空间。
四.如何判断是否为柔性数组
查看结构体的定义,检查结构体中最后一个成员是否为一个未指定大小的数组;
计算结构体总大小,再减去其他成员的大小,查看是否等于柔性数组的大小。