结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员
柔性数组的特点:
1.结构中的柔性数组成员前面必须至少一个其他成员。
2.sizeof 返回的这种结构大小不包括柔性数组的内存。
3.包含柔性数组成员的结构用malloc () 函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
代码1
#include<stdio.h>
#include<stdlib.h>
struct S
{
int n;
int arr[0];//柔性数组
};
int main()
{
struct S* str=NULL;
struct S s;
int i=0;
struct S* ps=(struct S*)malloc(sizeof(struct S)+5*sizeof(int));
printf("%d\n",sizeof(s));
ps->n=100;
for(i=0;i<5;i++)
{
ps->arr[i]=i;
printf("%d ",ps->arr[i]);
}
putchar('\n');
str=(struct S*)realloc(ps,11*sizeof(int));
if(str!=NULL)
{
ps=str;
}
for(i=5;i<10;i++)
{
ps->arr[i]=i;
printf("%d ",ps->arr[i]);
}
putchar('\n');
for(i=0;i<10;i++)
{
printf("%d ",ps->arr[i]);
}
free(ps);
ps=NULL;
return 0;
}
编译结果:
4//结构体大小为四个字节,柔性数组没有大小
0 1 2 3 4
5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 请按任意键继续. . .
代码2
#include<stdio.h>
#include<stdlib.h>
struct S
{
int n;
int *arr;
};
int main()
{
struct S s;
int i=0;
int* str=NULL;
struct S* ps=(struct S*)malloc(sizeof(struct S));
ps->arr=(int*)malloc(5*sizeof(int));
printf("%d\n",sizeof(s));
for(i=0;i<5;i++)
{
ps->arr[i]=i;
printf("%d ",ps->arr[i]);
}
putchar('\n');
str=(int*)realloc(ps->arr,10*sizeof(int));
if(str!=NULL)
{
ps->arr=str;
}
for(i=5;i<10;i++)
{
ps->arr[i]=i;
printf("%d ",ps->arr[i]);
}
putchar('\n');
for(i=0;i<10;i++)
{
printf("%d ",ps->arr[i]);
}
putchar('\n');
free(ps->arr);
ps->arr=NULL;
free(ps);
ps=NULL;
}
编译结果:
8
0 1 2 3 4
5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
请按任意键继续. . .
总结代码1和代码2:
代码1好一点,只需要free一次,而代码2要free两次。
代码1有利于访问速度,减少内存碎片。