一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
柔性数组:
定义:C99中,结构中最后一个元素允许是未知大小的数组,这就叫做柔性数组的成员
柔性数组的特点:
1.结构中的柔性数组成员前面必须至少一个其他成员。
typedef struct st_type
{
int i;
int a[];//柔性数组成员
}
2.sizeof返回的这种结构大小不包括柔性数组的内存。
struct S
{
int n;
int arr[];//柔性数组成员
};
int main()
{
printf("%d\n", sizeof(struct S));
return 0;
}
3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
使用:
struct S
{
int n;
int arr[0];//未知大小的-柔性数组成员-数组的大小是可以调整的
};
int main()
{
struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
return 0;
}
如果不使用柔性数组
struct S
{
int n;
int* arr;
};
int main()
{
struct S* ps = (struct S*)malloc(sizeof(struct S));
ps->arr = malloc(5 * sizeof(int));
int i = 0;
for (i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 5; i++)
{
printf("%d", ps->arr[i]);
}
//调整大小
int *ptr = relloc(ps->arr, 10 * sizeof(int));
if (ptr != NULL)
{
ps->arr = ptr;
}
for (i = 5; i < 10; i++)
{
ps->arr[i] = i;
}
for (i = 0; i < 10; i++)
{
printf("%d", ps->arr[i]);
}
//释放内存
free(ps->arr);
ps->arr = NULL;
free(ps);//释放两次
return 0;
}
使用柔性数组有两个好处:
1.方便内存的释放
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。
2.利于访问速度:连续的内存有益于提高访问速度