柔性陣列

不会笑的孩子發表於2024-05-16

什麼是柔性陣列

柔性陣列也稱為變長陣列,是一種動態陣列的實現方式。
與普通陣列不同的是,柔性陣列在定義時不需要明確指定陣列大小,在程式執行時可以動態地分配和擴充套件陣列大小,在程式執行時可以動態地分配和擴充套件陣列大小
柔性陣列是透過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.有利於訪問速度。連續的記憶體有益於提高訪問速度,也有益於減少記憶體碎片。

相關文章