定义:结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。
struct S1
{
int num;
char arr[];
};
柔性数组的特点:
- 结构中的柔性数组成员前面必须有至少一个其他成员。
- sizeof 返回这种结构大小不包括柔性数组的内存。
- 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
柔性数组的使用:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//柔性数组
struct S1
{
int num;
char arr[];
};
int main()
{
struct S1* p = (struct S1*)malloc(sizeof(struct S1) + 6);
p->num = 100;
int i = 0;
for (i = 0; i < 6; i++)
{
p->arr[i] = 'a'+i;
}
for (i = 0; i < 6; i++)
{
printf("%c ", p->arr[i]);
}
//增加容量
struct S1* ptr = realloc(p, 14);
if (ptr != NULL)
{
p = ptr;
}
for (i = 0; i < 10; i++)
{
p->arr[i] = 'x';
}
for (i = 0; i < 10; i++)
{
printf("%c ", p->arr[i]);
}
free(p);
p = NULL;
return 0;
}
柔性数组的优势:
- 方便内存释放:如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户,用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存给释放掉。
- 有利于提高访问速度:柔性数组在内存中开辟的是连续的内存,连续的内存有益于提高访问速度,也有益于减少内存碎片。