柔性数组
结构体的最后一个元素可以被允许是一个未知大小的数组,就叫做柔性数组。
#include <stdio.h>
#include <stlib.h>
struct S1
{
int num;
double d;
int arr[]; //柔性数组成员。
};
//或者
struct S2
{
int num;
double d;
int arr[0]; //柔性数组成员。
};
struct S3
{
int num;
int arr[];
};
int main()
{
printf("%d\n",sizeof(struct S3));
return 0;
}
//这样打印的结果为4,
//因为柔性成员前面必须有其他成员,这样计算的就是前面int的大小也就是4个字节。
//而且size返回这种结构不会包括柔性数组的内存。
//包含柔性暑促成员的结果用malloc()函数进行内存的动态分配。并且分配的内存一个大于结构
int main()
{
struct S3* ps = (struct S3*)malloc(sizeof(struct S3)+40);
//前面4个字节给num,后面40个字节给arr。40就是预留给柔性数组的空间。
//这个40可以通过realloc来调整。
if( ps == NULL)
{
perror("malloc"):
return 1;
}
ps->num = 100;
//在结构体成员num中放置100。
int i = 0;
for(i = 0; i<10; i++)
{
ps->arr[i] = i;
//放置元素。
}
//扩容
struct S3* ptr = (struct S3*)realloc(ps,sizeof(struct S3)+80);
if(ptr == NULL)
//判断扩容是否成功。
{
perror("realloc\n");
return 1;
}
else
{
ps = ptr;
}
for(i = 10;i < 20; i++)
{
ps->arr[i] = i;
}
for(i = 0;i < 20; i++)
{
printf("%d ",ps->arr[i]);
}
//释放
free(ps);
ps = NULL;
return 0;
}
#include <stdio.h>
struct S4
{
int num;
int* arr;
};
int main()
{
struct S4* ps = (struct S4*)malloc(sizeof(struct S4));
if (ps == NULL)
{
return 1;
}
ps->arr = (int*)malloc(40);
if (ps->arr == NULL)
{
free(ps);
ps = NULL;
return 1;
}
//使用
//...
//释放
free(ps->arr);
ps->arr = NULL;
free(ps);
ps = NULL;
return 0;
}
上面两组代码都可以完成同样的功能,但是前一种有几点好处。
方便内存释放,不是柔性数组的需要判断两次,释放两次。
柔性数组申请的空间的连续的,访问速度更快。非柔性数组会造成内存碎片(内存空间的浪费),导致内存利用率下降。因为malloc开辟了两次,开辟的空间不会连续。