柔性数组
C99中,结构体中最后一个元素允许是未知大小的数组,这叫做 【柔性数组】成员。
例1:
struct node {
int i;
int num[]; // 柔性数组成员
};
例2:
struct node {
int i;
int num[0]; // 柔性数组成员
};
柔性数组的特点:
- 结构中的柔性数组成员面前至少有一个其他成员。
sizeof
返回的结构体大小不包含柔性数组成员大小。- 包含柔性数组成员的结构用
malloc
函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组初始大小。
#include <stdlib.h>
#include <stdio.h>
typedef struct node {
int length;
int nums[]; // 柔性数组成员
}node;
int main() {
/*
sizeof(node) 的结果是4,这4个字节给到i元素
sizeof(int) * 10 的字节给到了柔性数组成员
*/
node* ps = (node*)malloc(sizeof(node) + sizeof(int) * 10);
if (ps == NULL) {
perror("malloc:");
exit(-1);
}
ps->length = 10;
int i = 0;
for (i = 0; i < ps->length; i++) {
ps->nums[i] = i;
}
// 扩容
node* new_ps = (node*)realloc(ps , sizeof(node) + sizeof(int) * 20);
if (new_ps == NULL) {
perror("realloc:");
exit(-1);
}
ps = new_ps;
ps->length = 20;
for (i = 10; i < ps->length; i++) {
ps->nums[i] = i;
}
for (i = 0; i < ps->length; i++) {
printf("%d ", ps->nums[i]);
}
free(ps);
ps = NULL;
return 0;
}
柔性数组的好处:
- 方便内存释放。
- 利于访问速度(连续的内存有益于提高访问速度,也有益于减少内存碎片)。