struct userdata
{
uint32_t len;
uint8_t data[0];
};
在閱讀一些開源代碼時,比如linux kernel,會發現上面這種用法,這種叫做零長度數組。有什麼作用呢?簡單來說爲了開發便利,順便節省空間。
使用限制
只能放在結構體結尾,也就是一個結構體只能有一個零長度數組。
使用場景
比如我們有一個變長的數據塊,如何保存這部分數據,有兩種方案。
固定長度數組
struct userdata
{
uint32_t len;
uint8_t data[128];
};
可以定義一個最大長度的數組,每次把數據放到該數組中。有兩個缺點
- 數據固定,如果超過最大值,會報錯,需要重新修改代碼編譯。
- 浪費空間,正常情況都不會存滿,導致內存浪費。
同樣這種方式也有優點
- 更好的性能。用空間換時間,數據是提前分配好的,避免了申請時的再次分配。
指針形式
struct userdata
{
uint32_t len;
uint8_t * data;
};
這樣在使用時現malloc申請空間,再賦值給data,缺點
- 多了一個指針,增加了空間佔用
優點
- 靈活,可以放在任何位置,可以有多個
零長度數組
struct line {
int length;
char contents[0];
};
struct line *thisline = (struct line *)
malloc (sizeof (struct line) + this_length);
thisline->length = this_length;
借用官方的示例說明以下,申請了一塊空間,多出來的就是contents的內容。優點
- contents不佔用空間,struct line的大小就是int length的大小。contents只是一個符號
- 數組空間不僅是動態的,還是連續的,更好的性能。使用指針,申請的空間與當前結構體不是連續的。
缺點
- 不夠靈活,只能放在最後