柔性数组

什么是柔性数组

柔性数组也称为变长数组,是一种动态数组的实现方式。
与普通数组不同的是,柔性数组在定义时不需要明确指定数组大小,在程序运行时可以动态地分配和扩展数组大小,在程序运行时可以动态地分配和扩展数组大小
柔性数组是通过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.有利于访问速度。连续的内存有益于提高访问速度,也有益于减少内存碎片。
posted @ 2024-05-16 17:16  不会笑的孩子  阅读(226)  评论(0编辑  收藏  举报