柔性数组
在C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫做【柔性数组】成员。
例如:
struct S
{
int n;
int arr[ ]; //未知大小——柔性数组成员,数组的大小是可以调整的
}
int main()
{
struct S s;
printf(“%d\n”,sizeof(s)); //结果为4,在计算大小的时候,不计算柔性数组的成员
return0;
}
结果:4
如何使用柔性数组呢?
实现方法1:
struct S
{
int n;
int arr[ ]; //未知大小——柔性数组成员,数组的大小是可以调整的
}
int main()
{
struct S* ps=(struct S*)malloc(sizeof(struct S)+5*sizeof(int));
ps->n=100;
int i=0;
for(i=0;i<5;i++)
{
ps->arr[i]=i; //0 1 2 3 4
}
//加入柔性数组太小了,我们应该如何增加它的内存(使用realloc)
struct S* ptr = realloc(ps,44);
//判断开辟的空间是否成功
if(ptr !=NULL)
{
ps = tr;
}
for(i=5;i<10;i++)
{
ps->arr[i]=i;
}
for (i=0;i<10;i++)
{
printf("%d",ps->arr[i])
}
return0;
}
struct S* ps=(struct S*)malloc(sizeof(struct S)+5*sizeof(int));
开创了24个字节,前面的4个字节是相当于给了n, 5*sizeof(int)这块内存是给数组开辟的。
以上代码展示了柔性数组可以变大也可以变小。
实现方法2:实现柔性数组的大小
下面展示一些 内联代码片
。
struct S
{
int n;
int* arr;
};
int main ()
{
struct S*ps=(struct S*)malloc(sizeof(struct S));
ps->arr = malloc(5*sizeof(int));
int i=0;
for(i=0;i<5;i++)
{
ps->arr[i]=i;
}
for(i=0;i<5;i++)
{
printf("%d",ps->arr[i]);
}
//调整大小
int *ptr = realloc(ps->arr,10*sizeof(int));
if (ptr |=NULL )
{
ps->arr=ptr;
}
for(i=5,i<10;i++)
{
ps->arr[i]=i
}
for(i=0;i<10;i++)
{
printf("%d";ps->arr[i]);
}
//释放内存(注意释放内存的顺序)
free(ps->arr);
ps->arr=NULL;
free(ps);
ps=NULL;
return0;
}
柔性数组的特点:
1.结构中的柔性数组成员前面必须至少一个其他成员
2.sizeof返回的这种结构大小不包括柔性数组的内存
3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小
柔性数组的优势
方法一的实现有两个好处:
1.方便内存释放
2.有利于访问速度