今天突然看到一個比較特別的知識點——柔性數組。它是在C99中出現的一種特別的數組,具體是指結構體中的最后一個元素允許是未知大小的數組,這就叫做『柔性數組』成員。
目錄
1.柔性數組的定義
2.柔性數組的特點
3.柔性數組的使用舉例
4.柔性數組的優點
1.柔性數組的定義
柔性數組定義的一般形式為:
typedef struct st_type
{?
????????int i;
????????int a[0];//柔性數組成員
}type_a;//這里的typedef是重命名的意思,是把原來struct struct st_type命名為type_a,以方便使用
?有些編譯器會報錯,我們可以改成下面這種定義方式。
typedef struct st_type
{?
????????int i;
????????int a[ ];//柔性數組成員
}type_a;
2.柔性數組的特點
①結構中的柔性數組成員前面必須至少有一個其他成員。?
②sizeof 返回的這種數據結構大小不包括柔性數組的內存。?
③包含柔性數組成員的結構用malloc ()函數進行內存的動態分配,并且分配的內存應該大于結構的大小,以適應柔性數組的預期大小,即malloc申請的空間應該是sizeof(結構體體變量)+柔性數組大小(用多少開辟多少)。?
struct st_type
{int i;int *a;//柔性數組成員}int main()
{printf("%d\n", sizeof(st_type));//輸出的是4return 0;
}
3.柔性數組的使用舉例
#include <stdio.h>
#include <stdlib.h>
int main()
{int i = 0;type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));//在使用前一定要定義,這里圖方便沒有定義p->i = 100;for(i=0; i<100; i++){p->a[i] = i;} free(p);//動態開辟的內存,記得及時釋放return 0;
}
4.柔性數組的優點
柔性數組是一個結構體的一個成員數組,在上面的例子中,整個結構體都是在堆上malloc出來的。此時,整個結構體都是存儲在堆上一塊連續的空間內,因為數組arr的大小是可以改變的,所以就叫柔性數組。但是實際上如果我們把柔性數組成員換成一個指針成員,然后通過malloc也是可以動態開辟空間的,如下圖代碼所示:
struct st_type
{int i;int *arr;//柔性數組成員}int main()
{struct st_type* ps = (struct st_type*)malloc(sizeof(struct st_type));if(ps == NULL){printf("malloc()->%s\n") , strerror(errno));return 1;}ps->arr = (int*)malloc(10 * sizeof(int));if(ps->arr == NULL){printf("2:malloc()->%s\n") , strerror(errno));return 1;}return 0;
}
上面指針arr在malloc后,即可當作數組使用。那么我們為什么要引入柔性數組呢?原因有以下兩點:
①方便內存釋放
使用時,柔性數組malloc一次,free一次;不使用柔性數組要malloc兩次,free兩次。如果我們的代碼是在一個給別人用的函數中,你在里面做了二次內存分配,并把整個結構體返回給用戶。用戶調用free可以釋放結構體,但是用戶并不知道這個結構體內的成員也需要free,所以你不能指望用戶來發現這個事。所以,如果我們把結構體的內存以及其成員要的內存一次性分配好了,并返 回給用戶一個結構體指針,用戶做一次free就可以把所有的內存也給釋放掉。
②有利于提高訪問速度
連續的內存有益于提高訪問速度,也有益于減少內存碎片。