柔性數組

首先,我們來看一個題

typedef struct list_t{
struct list_t *next;
struct list_t *prev;
char data[0];
}list_t;

此時,你知道32位系統中,sizeof(list_t)的值爲多少麼

這時,你會告訴我char data[0]在C和C++中是不被允許的,因爲看起來毫無意義。然而,此處爲何可以呢?

在講述柔性數組成員之前,首先要介紹一下不完整類型(incomplete type)。不完整類型是這樣一種類型,它缺乏足夠的信息例如長度去描述一個完整的對象,它的出現反映了C程序員對精煉代碼的極致追求,這種代碼結構產生於對動態結構體的需求。

  鑑於這種代碼結構所產生的重要作用,C99甚至把它收入了標準中。C99使用不完整類型實現柔性數組成員,在C99 中,結構中的最後一個元素允許是未知大小的數組,這就叫做柔性數組(flexible array)成員(也叫伸縮性數組成員),但結構中的柔性數組成員前面必須至少一個其他成員。柔性數組成員允許結構中包含一個大小可變的數組。柔性數組成員只作爲一個符號地址存在,而且必須是結構體的最後一個成員,sizeof 返回的這種結構大小不包括柔性數組的內存。柔性數組成員不僅可以用於字符數組,還可以是元素爲其它類型的數組。包含柔性數組成員的結構用malloc()函數進行內存的動態分配,並且分配的內存應該大於結構的大小,以適應柔性數組的預期大小。

並且柔性數組不佔內存和內存對齊。而且使用柔性數組可以大大簡化內容的管理,只需要一次申請,然後通過數組的指針偏移就可以直接獲得相應的數據緩衝區,非常簡單,釋放的時候也僅僅只需要一次釋放。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章