下班寫文章難免會有些出錯,也感謝那些在后臺留言指出錯誤的讀者;表驅(qū)那篇推文存在數(shù)組越界問題,可以通過預(yù)先開辟一個大數(shù)組的方式解決,但這樣解決方式會存在資源浪費問題,如果想不浪費資源來解決數(shù)組溢出的問題,那就來看看柔性數(shù)組怎么樣!
|簡單介紹
C99中,結(jié)構(gòu)體中的最后一個元素允許是未知大小的數(shù)組,這就叫作 柔性數(shù)組 。 柔性數(shù)組的特點:
結(jié)構(gòu)體中柔性數(shù)組成員前面必須至少有一個其他成員。
sizeof返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
包含柔性數(shù)組成員的結(jié)構(gòu)用malloc()函數(shù)進(jìn)行內(nèi)存的動態(tài)分配。
#includetypedef struct { int length; intarr[]; }data_t; int main() { data_t data1; printf("sizeof:%d ",sizeof(data1)); return 0; }
注意:在DEV CPP中,屏蔽了第五行并不會報錯!
| 簡單使用
#include#include typedef struct { int length; int arr[]; }data_t; int main() { //為結(jié)構(gòu)體及其柔性數(shù)組成員申請一塊連續(xù)的空間 data_t *p=(data_t*)malloc(sizeof(data_t)+10*sizeof(int)); if(NULL==p) { printf("malloc error "); return 0; } p->length=10; for(int i=0;i length;i++) { p->arr[i]=i;//賦值 printf("%d ",p->arr[i]); } printf(" "); //重新調(diào)整所申請的空間,將柔性數(shù)組調(diào)整為40 p=(data_t*)realloc(p,sizeof(int)+40); if(NULL==p) { printf("malloc error "); return 0; } p->length=40; for(int i=0;i length;i++) { p->arr[i]=i;//賦值 printf("%d ",p->arr[i]); } printf(" "); //釋放內(nèi)存 free(p); p=NULL; return 0; }
| 優(yōu)勢總結(jié)
柔性數(shù)組的特點在于只需要用一次malloc創(chuàng)建就可以,而且和結(jié)構(gòu)體是在同一塊連續(xù)的空間,對比在結(jié)構(gòu)體中放指針成員而言,可以減少內(nèi)存碎片化,因為malloc申請的內(nèi)存位置是任意的;柔性數(shù)組申請的內(nèi)存更加集中,有利于查找使用;柔性數(shù)組只用開辟一次,有利于提高訪問速度;用malloc函數(shù)進(jìn)行動態(tài)內(nèi)存申請時,柔性數(shù)組的大小應(yīng)該大于結(jié)構(gòu)體的大小以便于柔性數(shù)組適應(yīng)預(yù)期大小。 --END--
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3042瀏覽量
74182 -
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137266 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4344瀏覽量
62813 -
數(shù)組
+關(guān)注
關(guān)注
1文章
417瀏覽量
25990 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10860
原文標(biāo)題:C語言|柔性數(shù)組
文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論