骚年,是否没有听说过柔性数组?那就来看看吧,增加增加内功(装大佬的资本)
目录
定义与特点
定义:
在结构体中的最后一个数组的大小可以未知(或为0),即数组大小可变
表现为:
struct st
{
int a;
int b;
int arr[];//或者int arr [0];
};
特点:
1.想使用柔性数组,结构体中柔性数组前至少要有1个结构体成员
struct st
{
int a;//必须存在一个成员
int arr[];
};
2.使用sizeof计算其结构体大小时不包括柔性数组的大小
3.有柔性数组的结构体用malloc()来分配动态内存,并且所开空间应大于结构体大小,多余的空间给与柔性数组
struct st
{
int a;
int arr[];
};
int main()
{
struct st* p1=(struct st*)malloc(90);
//开辟一块空间给st,大小为90字节,首地址用p接收,但此写法arr的大小不明确,不推荐!
struct st* p2 = (struct st*)malloc(sizeof(struct st)+40);
//此写法方便判断arr大小为10个元素,增加可读性
return 0;
}
注意:使用free释放(合格的程序猿要养成好习惯)
free(p1);
free(p2);
p1 = NULL;
p2 = NULL;
柔性数组的替身
使用int*arr来代替arr[](解释:因为int*arr为指针,可接收地址,可将动态开辟的数组空间的首地址传给arr
具体展示
struct st
{
int a;
int* arr;
};
int main()
{
struct st* p = malloc(sizeof(struct st));
p->arr = malloc(40);
此方法亦可开辟可变空间的数组
柔性数组的优点
先说两者不同(如图):
1.内存位置不同
2.所需要的指针数不同(方便程度不同)
所以:
1.方便释放
如果直接free(p),柔性数组可以释放干净,而第二种方法可能释放不干净,需要先free(p2->arr)后再free(p)
2读取更快
缓存区一次读取的内存池是连续的,如果连续储存只需读取一次,如果分开存储可能需要多次读取