什么是柔性数组
柔性数组是C语言 C99 语法当中提出来的,结构体中的最后一个元素是未知大小的数组。
结构中的柔性数组成员前面必须至少一个其他成员。
sizeof 返回的这种结构体大小不包括柔性数组的内存。
包含柔性数组成员的结构用 malloc 函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
例如:
struct st_type
{
int i;
int a[];//柔性数组成员 表示数组的大小是不确定的
int a[0];//写成这种也可以 都是柔性数组成员
};
柔性数组使用举例
柔性数组扩容的时候,使用 malloc 要加上柔性数组的大小,这样就能知道要加几个数组内容了。举例:
struct st_type
{
int i;
int a[];
};
int main()
{
//增加 10 个数组内容
struct st_type* ps = (struct st_type*)malloc(sizeof(struct st_type) + 10 * sizeof(int));
return 0;
}
这里的柔性数组就是可以放 10 个元素。当柔性数组不够用的时候,也可以通过 realloc 来调整大小。例如:
struct st_type* ptr = realloc(ps, sizeof(struct st_type) + 10 * sizeof(int));
if (ptr == NULL)
{
printf("扩展空间失败\n");
return -1;
}
else
{
ps = ptr;
}
使用柔性数组的优势
方便释放 。因为只 malloc 了一次,所以内存泄漏等问题就减少了 。
柔性数组前面的成员,也会存在内存对齐。
在读取内存的时候,有一个局部性原理,在读取一个位置的数据的时候,接下来大概率需要的是周围的数据。
数据存储有寄存器、高速缓存和内存 程序读取处理的数据,可能放在寄存器里面 因为寄存器的读取速度更快。
就是当我们使用一个数据的时候,接下来大概率使用周围的数据,当使用一个数据的时候,就会把它周围的数据加载到高速缓存当中,再从高速缓存加载到寄存器当中去,这样就能从寄存器当中很快的访问到周围的数据。
这样的话,访问效率就更高了,所以柔性数组的效率会更高。