柔性数组的实现
struct S
{
int n;
int arr[0];
};
void vary_array(void)
{
//struct S s;
struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
ps->n = 100;
for (int i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
struct S* ptr = realloc(ps, 44);
if (ptr != NULL)
{
ps = ptr;
for (int i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (int i = 0; i < 10; i++)
{
printf("%d", ps->arr[i]);
}
}
free(ps);
ps = NULL;
}
类柔性数组的代码
struct Q
{
int n;
int *arr;
};
void vary_array_s(void)
{
struct Q* ps = (struct Q*)malloc(sizeof(struct Q));
ps->arr = malloc(5 * sizeof(int));
ps->n=100;
for (int i = 0; i < 5; i++)
{
ps->arr[i] = i;
printf("%d", ps->arr[i]);
}
//add
int* ptr = (int*)malloc(44);
if (ptr != NULL)
{
ps->arr = ptr;
for (int i = 5; i < 10; i++)
{
ps->arr[i] = i;
printf("%d", ps->arr[i]);
}
}
free(ps->arr);
ps->arr = NULL;
free(ps);
ps = NULL;
}
二者的差别
最大的差别很明显就是柔性数组的方式只用了一次动态开辟而第二种方式用了两次,就这个区别对代码的影响就已经非常大了。
柔性数组的特点
1.结构中柔性数组成员前面必须至少有一个其他成员
2.sizeof返回结构内存的大小不包括柔性素组的内存
3.包含柔性数组成员的结构用malloc()进行动态内存分配,并且分配内存应该大于结构的大小,以适应柔性数组的预期大小。
柔性数组的优势
方便内存释放
和第二种方法相比由于柔性数组只开辟了一次,更易于释放。
有利于访问速度
另外柔性数组方式开辟的空间是连续的,这样内存碎片会更少,对于访问的时间会更少。
另外对于realloc函数的用法我之前有误解,实际上realloc里面的news_size是是包括了旧空间的大小。