柔性数组
什么是柔性数组
柔性数组也称为变长数组,是一种动态数组的实现方式。
与普通数组不同的是,柔性数组在定义时不需要明确指定数组大小,在程序运行时可以动态地分配和扩展数组大小,在程序运行时可以动态地分配和扩展数组大小
柔性数组是通过C99标准中提供的结构体成员为未知长度的数组的特性来实现的,它需要一个结构体作为数组的容器,并在结构体定义中,最后一个数组成员不指定长度如:
struct tagPascalString
{
short int length;
char data[0];
};
柔性数组的特点
- 结构体中的柔性数组前面必须至少一个其他成员。
- sizeof返回的这种结构大小不包括柔性数组的内存。
- 包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
柔性数组的使用
使用柔性数组时,我们需要手动分配内存空间,并且调整数组的大小。例如,可以使用malloc函数分配内存空间,并且根据实际需要调整数组的大小。
struct S
{
char c;
int i;
int arr[];//未知大小的数组-柔性数组
};
int main()
{
struct S *ps = (struct S*)malloc(sizeof(struct S)+20);
//检查是否分配成功
if(ps==NULL)
{
return 0;
}
int i =0;
ps->i = 100;
for(i = 0; i<100;i++)
{
ps_=->arr[i] = i;
}
for(i = 0;i<100;i++)
{
printf("%d",ps->arr[i]);
}
//释放掉申请好的空间
free(ps);
//最后将ps置为空 避免出现野指针情况
ps = NULL;
return 0;
}
4.柔性数组与其他对比优势
struct S
{
char c;
int i;
int* data;
};
int main()
{
struct S *ps = (struct S*)malloc(sizeof(struct S));
if(ps == NULL)
{
return 0;
}
ps->c = 'w';
ps->i = 100;
ps->data = (int*)malloc(20);
if(ps->data == NULL)
{
return 0;
}
int i = 0;
for(i = 0; i<5;i++)
{
ps->data[i] = i;
}
for(i = 0; i<5;i++)
{
printf("%d ",ps->data[i]);
}
//空间不够了进行增容
int *ptr = (int *)realloc(ps->data,40);
if(ptr == NULL)
{
return 0;
}
else
{
ps->data = ptr;
}
//增容成功就是用
//
//释放时应该遵循的条件先申请的后释放
//释放
free(ps->data);
ps->data = NULL;
free(ps);
ps = NULL;
return 0;
}
两个程序可以完成同样的功能,但是之前的程序有两个优点:
- 1.方便内存释放。如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户发现这个事。所以,如果我们把结构体的内存以及其成员瑶的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的的内存也给释放掉。
- 2.有利于访问速度。连续的内存有益于提高访问速度,也有益于减少内存碎片。