柔性数组:结构体中最后一个元素是未知大小的数组,数组大小可变
柔性数组特点
①结构体中的柔性数组成员前面必须至少有一个其他成员
②sizeof返回的结构体大小不包括柔性数组的内存
③包含柔性数组成员的结构体要用malloc()函数进行内存分配
使用free函数释放一块内存,不能多次释放同一块内存 ,否则程序会崩溃
柔性数组使用举例(结构体成员内存是连续的)
1.
#include#includestruct 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;}
使用指针实现柔性数组的操作举例(结构体成员内存是不连续的)
2.
#include#includestruct 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;}