柔性数组:结构体中最后一个元素是未知大小的数组,数组大小可变
柔性数组特点
①结构体中的柔性数组成员前面必须至少有一个其他成员
②sizeof返回的结构体大小不包括柔性数组的内存
③包含柔性数组成员的结构体要用malloc()函数进行内存分配
使用free函数释放一块内存,不能多次释放同一块内存 ,否则程序会崩溃
柔性数组使用举例(结构体成员内存是连续的)
c
#include<stdio.h>
#include<stdlib.h>
struct S{
int a;
int arr[0];
};
int main(){
struct S stu;
printf("%d\n",sizeof(stu));
//结果是4 数不包含柔性数组的大小
struct S *temp=(struct S*)malloc(4*sizeof(int));
for(int i=0;i<3;i++)
{
temp->arr[i]=i;
}
for(int i=0;i<3;i++)
{
printf("%d",temp->arr[i]);
}
//利用realloc改变数组大小
struct S *te=realloc(temp,10*sizeof(int));
if(te!=NULL)
{
temp=te;
}
for(int i=3;i<9;i++)
{
temp->arr[i]=i;
}
for(int i=3;i<9;i++)
{
printf("%d",temp->arr[i]);
}
free(temp);
temp=NULL;
return 0;
}
使用指针实现柔性数组的操作举例(结构体成员内存是不连续的)
c
#include<stdio.h>
#include<stdlib.h>
struct S{
int a;
int *arr;
};
int main(){
struct S stu;
struct S *temp=(struct S*)malloc(sizeof(struct S));
temp->arr=(int *)malloc(3*sizeof(int));
for(int i=0;i<3;i++)
{
temp->arr[i]=i;
}
for(int i=0;i<3;i++)
{
printf("%d",temp->arr[i]);
}
int *te=realloc(temp->arr,10*sizeof(int));
if(te!=NULL)
{
temp->arr=te;
}
for(int i=3;i<10;i++)
{
temp->arr[i]=i;
}
for(int i=3;i<10;i++)
{
printf("%d",temp->arr[i]);
}
free( temp->arr);
temp->arr=NULL;
free(temp);
temp=NULL;
}