c柔性陣列

2021-09-11 05:47:21 字數 940 閱讀 8239

一 , 定義

c99及以上標準支援

標準示例如下:

typedef struct st_type

type_a;

初始大小為sizeof(i),0個元素的陣列沒有占用空間,而後我們可以進行變長操作了。

通過如下表示式給結構體分配記憶體:

type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));

但是這時候我們再用 sizeof(*p)測試結構體的大小,發現仍然為 4

因為在定義這個結構體的時候,模子的大小就已經確定不包含柔性陣列的記憶體大小。柔性陣列只是編外人員,不佔結構體的編制。只是說

在使用柔性陣列時需要把它當作結構體的乙個成員,僅此而已。再說白點,柔性陣列其實與

結構體沒什麼關係,只是「掛羊頭賣狗肉」而已,算不得結構體的正式成員.???? 待驗證

二, 對比

typedef struct st_type

type_a;

將a修改為a*, 此時a只是乙個指標, 只是占用結構體8個位元組的大小(即乙個指標記憶體大小)

相比較, 使用柔性陣列的好處

第乙個意義是,方便記憶體釋放。如果我們的**是在乙個給別人用的函式中,你在裡面做了二次記憶體分配,並把整個結構體返回給使用者。使用者呼叫free可以釋放結構體,但是使用者並不知道這個結構體內的成員也需要free,所以你不能指望使用者來發現這個事。所以,如果我們把結構體的記憶體以及其成員要的記憶體一次性分配好了,並返回給使用者乙個結構體指標,使用者做一次free就可以把所有的記憶體也給釋放掉。(讀到這裡,你一定會覺得c++的封閉中的析構函式會讓這事容易和乾淨很多)

第二個原因是,這樣有利於訪問速度。連續的記憶體有益於提高訪問速度,也有益於減少記憶體碎片

C語言 柔性陣列

柔性陣列 flexible array 也叫伸縮性陣列,其實就是變長陣列,反映了c語言對精煉 的極致追求。這種 結構產生於對動態結構體的需求。比如我們需要在結構體中存放乙個動態長度的字串,這時候,柔性陣列可以大顯身手了。c99使用不完整型別來實現柔性陣列,標準形式如下 struct mystruct...

C語言柔性陣列

1 柔性陣列 c語言中結構體的最後乙個元素可以是大小未知的陣列 c語言中可以由結構體產生柔性陣列 typedef struct soft array softarray 可以試試,printf d sizeof softarray 列印出它的sizeof 大小 結果是4,也就是說array這個未知長...

c 之 柔性陣列

今天看到乙個有趣的知識點,在這裡分享下。可以直接 閱讀原文 includestruct test0 struct test1 int main void 在64位機器上編譯執行結果 16 8是不是感覺到不可思議。往下看。對於test0的結果是16,通常沒有什麼疑問,畢竟4 int 4 int 8 指...