标题:C语言结构体中的【柔性数组】成员
C99标准中, 允许结构体中的最后一个成员变量是一个未知大小的数组,这就是【柔性数组】成员。它的声明如下:
struct S
{
int a;
int arr[];//柔性数组成员,这是一种声明方式
};
struct S
{
int a;
int arr[0]//这是另外一种声明方式
}
有些编译器支持第一种,有些编译器支持第二种,当然像VS2019的话都支持。
柔性数组成员有以下几个特点:
1、【柔性数组】成员的前面必须至少有一个其他类型的成员。
2、sizeof 运算符计算 struct S 时不会包含柔性数组的大小
int main()
{
//打印出来的是4
printf("%d\n", sizeof(struct S));
return 0;
}
3、结构体中包含了【柔性数组】成员的话,要用 malloc 函数来开辟空间,也就是动态开辟,并且开辟的大小要大于结构体本身以适应柔性数组的预期大小。
int main()
{
//假设柔性数组的预期大小是40个字节
//sizeof(struct S)是为柔性数组前面的成员变量n开辟的
//sizeof(int) * 10 是为柔性数组开辟的
struct S = (struct S*)malloc(sizeof(struct S) + sizeof(int) * 10);
return 0;
}
如果 40 个字节不够用,那么可以用 realloc 函数来重新调整,这就显示出来柔性来,也就是可变。