1.柔性数组
在c99中,结构体中的最后一个元素允许是未知大小的数组,这就叫做-----柔性数组
struct Class
{
int num;
char teacher[20];
int a[];//柔性数组
}a1;
或者
struct Class
{
int num;
char teacher[20];
int a[0];//柔性数组
}a1;
写法取决于编译器支持,在vs2022中两种写法都是支持的。
2.柔性数组的特点
结构中的柔性数组成员前面必须至少一个其他成员。
这是非法的。
sizeof 返回的这种结构大小不包括柔性数组的内存。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct Class
{
char c;
int num;
int arr[];//柔性数组成员
};
int main()
{
printf("%zd\n", sizeof(struct Class));
return 0;
}
可见柔性数组特点的确如此。
包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小
在开辟8字节空间后我们再给柔性数组成员开辟12个字节。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct Class
{
char c;
int num;
int arr[0];//柔性数组成员
}a1;
int main()
{
struct Class* p = malloc(sizeof(a1) + 12);
if (p == NULL)
{
perror("malloc");
return 1;
}
//.......
return 0;
}
相当于提前先默认开辟了3个整形空间给柔性数组arr。后续我们还可以使用calloc来更改大小。