提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
小编今天又给大家带来新东西了,相信柔性数组这个名词对于大部分人都比较陌生,那接下来就让我们去认识认识这个新朋友
1.柔性数组是什么
C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,可能这个说法对于大家而言比较抽象,那下面请看具体实例
typedef struct s
{
int a;
int arr[];//柔性数组成员
}type;
可能大家还见过另外版本的柔性数组,如
typedef struct s
{
int a;
int arr[0];//柔性数组成员
}type;
这里的0和不写表示的意思是一样的,指的是数组大小是未知的,但对于第二个版本可能有些编译器存在着无法编译的问题。
2.柔性数组的特点
1.结构中的柔性数组成员前面必须至少一个其他成员。
2.sizeof 返回的这种结构大小不包括柔性数组的内存。
3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
这里第二点我需要给大家验证一下:
#include <stdio.h>
int main()
{
typedef struct s
{
int a;
int arr[];//柔性数组成员
}type;
printf("%d", sizeof(type));
}
下面输出结果是:
这里我们发现该结构在内存只占4个字节,并没有包含该柔性数组
3.柔性数组的使用
对于柔性数组的使用,我们是使用动态内存开辟函数对该进行开辟使用的,接下来大家请看代码
#include <stdio.h>
#include<stdlib.h>
int main()
{
typedef struct s
{
int a;
int arr[];//柔性数组成员
}type;
type* pa = (type*)malloc(sizeof(type) * 100);//这里对于该数组的空间就开辟好了
int i = 0;
for (i = 0; i < 100; i++)
{
pa->arr[i] = i;
}
for (i = 0; i < 100; i++)
{
printf("%d ", pa->arr[i]);
}
free(pa);
pa = NULL;
}
结果展示:
对于该内存的开辟,我浅显的给大家画一幅图展示一下
4.柔性数组的优势
这里大家可能会说我使用动态内存开辟也能达到此类效果,那对于柔性数组的使用,优势又在何处呢?
第一个好处是:
方便内存释放
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给
用户。用户调用
free
可以释放结构体,但是用户并不知道这个结构体内的成员也需要
free
,所以你
不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好
了,并返回给用户一个结构体指针,用户做一次
free
就可以把所有的内存也给释放掉。
第二个好处是:
这样有利于访问速度
.
连续的内存有益于提高访问速度,也有益于减少内存碎片。