1. 程式人生 > >c結構體中的 柔性陣列

c結構體中的 柔性陣列

開發C程式碼時,經常見到如下型別的結構體定義:
1 2 3 4 5 typedef struct list_t{ struct list_t *next; struct list_t *prev; char data[0]; }list_t;

最後一行char data[0];的作用是?

方便管理記憶體緩衝區
減少記憶體碎片化

 看不懂char data[0];請去百度  柔性陣列,它只能放在結構體末尾,是 申明一個長度為0的陣列,就可以使得這個結構體是可變長的。對於編譯器來說,此時長度為0的陣列並不佔用空間,因為陣列名本身不佔空間,它只是一個偏移量, 陣列名這個符號本身代 表了一個不可修改的地址常量 (注意:陣列名永遠都不會是指標! ),但對於這個陣列的大小,我們可以進行動態分配 請仔細理解後半部分,對於編譯器而言,陣列名僅僅是一個符號,它不會佔用任何空間,它在結構體中,只是代表了一個偏移量,代表一個不可修改的地址常量!  對於0長陣列的這個特點,很容易構造出變成結構體,如緩衝區,資料包等等: 注意:構造緩衝區就是方便管理記憶體緩衝區,減少記憶體碎片化,它的作用不是標誌結構體結束,而是擴充套件 柔性陣列是C99的擴充套件,簡而言之就是一個在struct結構裡的標識佔位符(不佔結構struct的空間)。

struct MyData 


{
int nLen;
char data[0];
}; 
在結構中,data是一個數組名;但該陣列沒有元素;該陣列的真實地址緊隨結構體MyData之後,而這個地址就是結構體後面資料的地址(如果給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容);這種宣告方法可以巧妙的實現C語言裡的陣列擴充套件。

這樣整體形成一個數據包,好處是char data[0]不佔用空間,而且形成一個整體,
訪問時依靠陣列下標溢位的特性,p->data[size],在早期有些技術牛人都愛這樣寫,
不過在今天這是一種不安全的寫法,不推薦,而且現在的編譯器也比較嚴格,一般通不過編譯了。