1.什么是柔性数组
c99中规定,结构体中最后一个元素允许是未知大小的数组,叫做柔性数组.
从这里看出柔性数组只会出现在结构体当中.下面写一个简单的代码认识一下柔性数组
struct stu
{
int i;
int a[0];
};
上面代码中a就是一个柔性数组,当然a后面的[ ],里面的0;可写可不写,取决于编译器.
当一个结构体中存在柔性数组时,不会计算柔性数组的大小,上面这个结构体大小为4个字节.
2.柔性数组与动态内存相结合
当柔性数组与动态内存相结合时,其实就是为柔性数组开辟一个空间,空间大小可以修改,这就体现了柔性数组的特点.那么请看下面这段代码:
struct S
{
int i;
int arr[];
};
int main()
{
struct S *p->arr=(struct S *)malloc(20);
if(p==NULL)
{
perror("malloc");
return 1;
}
p->i=100;
for(int j=0;j<10;j++)
{
p->arr[j]=j;
}
//如果空间不够用,可以再开辟;
struct S *ptr=realloc(ps,sizeof(struct S+15*sizeof(int));
//其中15*sizeof(int)就是为数组开辟的空间大小
//...可以一直开辟.
if(ptr==NULL)
{
perror("realloc");
}
else
{
ps=ptr;
}
//...
//如果不适用及时释放;并置为NULL
free(ps);
ps=NULL; //防止ps成为野指针;
return 0;
}
通过上面的代码可以看出,可随便改变柔性数组的大小,使用起来也很方便.
3.模拟实现柔性数组
看下面一段代码
struct ST
{
int i;
int*arr;
};
int main()
{
struct ST * ps=(struct ST*)malloc(sizeof(struct ST));
此时开辟的是ST这个结构体的大小的空间
if(ps==NULL)
{
perror("malloc");
return 1; //NULL返回1
}
//使用开辟的空间
ps->i=100;
//为柔性数组开辟空间大小为5*4=20个字节;
ps->arr=(int *)malloc(5*sizeof(int));
if(ps->arr==NULL)
{
perror("malloc");
return 1;
}
//使用开辟的空间
for(int j=0;j<10;j++)
{
ps->*(arr+j)=j;
}
//发现数组不够用,那再开辟空间
int * ptr=(int *)realloc(ps-arr,15*sizeof(int));
if(ps->ptr==NULL)
{
perror("realloc");
return 2;
}
else
{
ps->arr=ptr;
}
for(int j =0;j<10;j++)
{
ps->*(arr+j)=j;
}
free(ps->arr);
ps->arr=NULL;
free(ps);
ps = NULL;
return 0;
}
上面这段代码也是使用柔性数组的一种方法,这种方法会比上面使用柔性数组性能高一点(高不了多少),但是这中方法如果空间不够用,会开辟多处空间,这时就要注意,在释放空间的时候要释放多次,并且及时将指针置为空.
以上就是柔性数组的使用.