c結構體中的 柔性陣列

2021-07-22 15:44:03 字數 966 閱讀 4504

出處:

開發c**時,經常見到如下型別的結構體定義:

1

2

3

4

5

typedefstructlist_tlist_t;

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

方便管理記憶體緩衝區

減少記憶體碎片化

申明乙個長度為0的陣列,就可以使得這個結構體是可變長的。對於編譯器來說,此時長度為0的陣列並不占用空間,因為陣列名本身不佔空間,它只是乙個偏移量, 陣列名這個符號本身代 表了乙個不可修改的位址常量 (注意:陣列名永遠都不會是指標! ),但對於這個陣列的大小,我們可以進行動態分配 請仔細理解後半部分,對於編譯器而言,陣列名僅僅是乙個符號,它不會占用任何空間,它在結構體中,只是代表了乙個偏移量,代表乙個不可修改的位址常量!

對於0長陣列的這個特點,很容易構造出變成結構體,如緩衝區,資料報等等:

注意:構造緩衝區就是方便管理記憶體緩衝區,減少記憶體碎片化,它的作用不是標誌結構體結束,而是擴充套件

柔性陣列是c99的擴充套件,簡而言之就是乙個在struct結構裡的標識佔位符(不佔結構struct的空間)。

struct mydata 

; 在結構中,data是乙個陣列名;但該陣列沒有元素;該陣列的真實位址緊隨結構體mydata之後,而這個位址就是結構體後面資料的位址(如果給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容);這種宣告方法可以巧妙的實現c語言裡的陣列擴充套件。

這樣整體形成乙個資料報,好處是char data[0]不占用空間,而且形成乙個整體,

訪問時依靠陣列下標溢位的特性,p->data[size],在早期有些技術牛人都愛這樣寫,

不過在今天這是一種不安全的寫法,不推薦,而且現在的編譯器也比較嚴格,一般通不過編譯了。

基礎 結構體 結構體中的柔性陣列

typedef struct test 造成字串與結構體內存是分離的,有時候不利於操作,例如 複製和訪問的時候,需要做些額外操作。char a hello world test stptest test malloc sizeof test strlen a 1 strcpy char stptes...

C語言之結構體 產生柔性陣列

知識點 1 柔性陣列即陣列大小待定的陣列 2 c語言的結構體的最後乙個元素可以是乙個大小未定的陣列 3 c語言通過結構體實現柔性陣列 include include malloc 函式要用到 typedef struct soft array 建立柔性陣列的結構體,並且複雜宣告為softarray ...

柔性陣列及可變長結構體

參考 c語言柔性陣列 可變大小結構體如何定義詳解 c primer plus 第六版 14.7.9小節 先看下面這個結構體 struct s test 如上結構體中最後乙個元素允許是未知大小的陣列,這個陣列就是柔性陣列,這樣有柔性陣列成員 flexible array member 的結構體也被稱為...