先看两组代码
一组是使用柔性数组开辟空间
#include<stdio.h>
#include<stdlib.h>
struct S
{
int n;
int arr[];//创建柔性数组前必须要定义变量
};
int main()
{
//printf("%d ", sizeof(struct ARR));//4 sizeof计算结构体大小只计算int n
struct S*ps = (struct S*)malloc(sizeof(int)+5 * sizeof(int));//mollco开辟n的4个字节大小+数组arr的大小
for (int i = 0; i < 5; i++)
{
*(ps->arr + i) = i;
}
struct S* ptr = realloc(ps, (4+40));
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;
}
柔性数组的特点:
结构中的柔性数组成员前面必须至少一个其他成员。
sizeof
返回的这种结构大小不包括柔性数组的内存。
包含柔性数组成员的结构用
malloc ()
函数进行内存的动态分配,并且分配的内存应该大于结构的大
小,以适应柔性数组的预期大小。
一组是使用arr指针开辟空间
#include<stdio.h>
#include<stdlib.h>
struct S
{
int n;
int *arr;
};
int main()
{
structS* ps = (struct S*)malloc(sizeof(struct S));
ps->arr = malloc(5*sizeof(int));
for (int i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
int* ptr = realloc(ps->arr, 10 * sizeof(int));
if (ptr != NULL)
{
ps->arr = 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->arr);
ps->arr = NULL;
free(ps);
ps = NULL;
return 0;
}
两组代码都有相同的结果
区别在于:
柔性数组开辟的空间是连续的,free使用一次
arr指针开辟的是碎片的,free使用两次
述
代码
1
和
代码
2
可以完成同样的功能,但是
方法
1
的实现有两个好处:
1.方便内存释放
arr指针开辟的是碎片的,第二组要释放结构体的内存和成员的内存。而一组只有一个内存块需要释放。
2.
这样有利于访问速度
.
连续的内存有益于提高访问速度,也有益于减少内存碎片。