c結構體中的 柔性數組

出處:http://blog.csdn.net/stand1210/article/details/52459372

開發C代碼時,經常見到如下類型的結構體定義:
1
2
3
4
5
typedefstruct  list_t{
structlist_t *next;
structlist_t *prev;
chardata[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],在早期有些技術牛人都愛這樣寫, 
不過在今天這是一種不安全的寫法,不推薦,而且現在的編譯器也比較嚴格,一般通不過編譯了。


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