在c99中,對於結構體中的最後乙個成員,可以允許最後乙個成員是未知大小的陣列,這樣的陣列就叫做柔性陣列。
typedef
struct st_type
type_a;
某些編譯器對於這種寫法會報錯,我們可以改寫為下面的形式:
typedef
struct st_type
type_a;
例如:
typedef
struct st_type
type_a;
printf("%d",sizeof(type_a));//4
int i=0;
type_a *p=(type_a *)malloc(sizeof(type_a)+100*sizeof(int));
p->i=100;
for(i=0;i<100;i++)
free(p);
這樣柔性陣列成員a,相當於獲得了100個整型元素的連續空間。
上面的結構體也可以設計成這樣:
typedef
struct st_type
type_a;
type_a *p=(type_a *)malloc(sizeof(type_a));
p->i=100;
p->p_a=(int *)malloc(p->i*sizeof(int));
for(i=0;i<100;i++)
free(p->p_a);
p->p_a=null;
free(p);
p=null;
上述兩種方式可以完成同樣的功能,但是使用第一種柔性陣列的實現有兩個好處:
第乙個好處是:方便記憶體釋放
如果我們的**是在乙個給別人用的函式中,你在函式中做了兩次記憶體分配,並把整個結構體返回給使用者。使用者呼叫free可以釋放結構體,但是使用者並不知道這個結構體內的成員也需要free,所以你不能指望使用者來發現這個事。所以,如果我們把結構體的記憶體以及其成員要的記憶體一次性分配好了,並返回給使用者乙個結構體指標,使用者做一次free就可以把所有的記憶體
也給釋放掉。
第二個好處是:有利於訪問速度.
連續的記憶體有益於提高訪問速度,也有益於減少記憶體碎片。
柔性陣列(flexible array)
相信好多人都沒聽過這個概念 柔性陣列 flexible array 到底什麼是柔性陣列呢?柔性陣列的定義 結構中最後乙個元素允許是未知大小的陣列,這就是柔性陣列。柔性陣列的使用舉例 include include include typedef struct c c intmain void pri...
c柔性陣列
一 定義 c99及以上標準支援 標準示例如下 typedef struct st type type a 初始大小為sizeof i 0個元素的陣列沒有占用空間,而後我們可以進行變長操作了。通過如下表示式給結構體分配記憶體 type a p type a malloc sizeof type a 1...
試題 柔性陣列
目錄 一 試題 開發c 時,經常見到如下型別的結構體定義 二 請分析下面的程式,看一看如何使用柔性陣列。三 結構體中使用指標實現柔性陣列功能 橫掃offer 程式設計師招聘真題詳解700題 著者 開點工作室編著 p51 typedef struct list t list t 最後一行char da...