“柔性数组”从这个名字就可以看出来这种数组的大小大概是可以动态变化的。
事实也确实如此,在C99标准中,柔性数组有两个特点:是结构中最后一个成员;它的大小是未被定义的。如下:
struct S1
{
int num;
char c;
int arr[];//柔性数组成员
};
struct S2
{
int num;
char c;
int arr[0];//柔性数组成员
};
那么柔性数组该怎么实现呢?
联系动态内存的知识,我们知道,使用malloc函数可以轻松实现内存的动态变化,如果要实现柔性数组,就可以利用malloc开辟空间。但用malloc时,我们得知道要开辟的空间大小,这个空间一定要大于结构体的大小,不然容纳不了结构体。
问题就来了,存在柔性数组的结构大小是多少?我们不知道柔性数组的大小,似乎无法计算结构体的大小。而向解决这个问题实际上十分容易:使用sizeof运行一下代码就行,如下:
#include<stdio.h>
#include<stdlib.h>
struct S
{
int num;
int arr[0];//柔性数组成员
};
int main()
{
printf("%d\n", sizeof(struct S));
return 0;
}
运行结果是4,正好是int类型的大小,说明用sizeof计算含有柔性数组的结构体时,返回的值中不包含柔性数组的大小。这样的话,我们用malloc轻松实现柔性数组:
#include<stdio.h>
#include<stdlib.h>
struct S
{
int num;
int arr[0];//柔性数组成员
};
int main()
{
struct S* ps = (struct S*)malloc(sizeof(struct S) + 20);
if (ps == NULL)
{
perror("malloc\n");
return 1;
}
//扩容
struct S* p = (struct S*)realloc(ps, sizeof(struct S) + 40);
if (p == NULL)
{
perror("realloc\n");
return 1;
}
ps = p;
//赋值
ps->num = 10;
int i = 0;
for (i = 0; i < 10; i++)
{
ps->arr[i] = i;
}
//打印
for (i = 0; i < 10; i++)
{
printf("%d ", ps->arr[i]);
}
//释放
free(ps);
ps = NULL;
return 0;
}
运行结果如下:
注:1.本文中提到的结构都是含有柔性数组的结构。
2.含有柔性数组的结构有2个以上的成员。