C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫“柔性数组”成员。
struct A {
int a;
int arr[0]; // 柔性数组
//int arr[]; // 柔性数组
};
1. 结构体这种的柔性数组成员前必须至少还有一个其他成员;
2. sizeof这种结构体的大小,不包括柔性数组的内存;
3. 包含柔性数组成员的结构体,应该用malloc函数进行动态内存分配,并且分配的内存大小应该大于结构体大小,以适应柔性数组的预期大小。
//为柔性数组预期开辟40字节
struct A* ps = (struct A*)malloc(sizeof(struct A) + 40);
for (int i = 0; i < 10; ++i) {
ps->arr[i] = i + 1;
}
//将柔性数组追加为80字节
struct A* temp = realloc(ps, sizeof(struct A) + 80);
if (temp != NULL) {
ps = temp;
for (int i = 10; i < 20; ++i) {
ps->arr[i] = i + 1;
}
for (int i = 0; i < 20; ++i) {
printf("%d ", ps->arr[i]);
}
}
free(ps);
如果结构体中的动态数组采用的是二次内存分配,用户在调用free释放结构体时,可能就会忽略结构体内部的动态分配的成员的释放,即使能够注意到,需要进行二次释放也会添加用户的一个使用复杂度。而柔性数组是将结构体的内存以及其成员所需内存一次分配好的连续空间,用户只需要进行一次释放即可。
连续的内存有利于提高访问速度,也有利于减少内存碎片。