下班寫文章難免會(huì)有些出錯(cuò),也感謝那些在后臺(tái)留言指出錯(cuò)誤的讀者;表驅(qū)那篇推文存在數(shù)組越界問題,可以通過預(yù)先開辟一個(gè)大數(shù)組的方式解決,但這樣解決方式會(huì)存在資源浪費(fèi)問題,如果想不浪費(fèi)資源來解決數(shù)組溢出的問題,那就來看看柔性數(shù)組怎么樣!
|簡單介紹
C99中,結(jié)構(gòu)體中的最后一個(gè)元素允許是未知大小的數(shù)組,這就叫作 柔性數(shù)組 。 柔性數(shù)組的特點(diǎn):
結(jié)構(gòu)體中柔性數(shù)組成員前面必須至少有一個(gè)其他成員。
sizeof返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。
包含柔性數(shù)組成員的結(jié)構(gòu)用malloc()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配。
#includetypedef struct { int length; intarr[]; }data_t; int main() { data_t data1; printf("sizeof:%d ",sizeof(data1)); return 0; }
注意:在DEV CPP中,屏蔽了第五行并不會(huì)報(bào)錯(cuò)!
| 簡單使用
#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ù)組的特點(diǎn)在于只需要用一次malloc創(chuàng)建就可以,而且和結(jié)構(gòu)體是在同一塊連續(xù)的空間,對比在結(jié)構(gòu)體中放指針成員而言,可以減少內(nèi)存碎片化,因?yàn)閙alloc申請的內(nèi)存位置是任意的;柔性數(shù)組申請的內(nèi)存更加集中,有利于查找使用;柔性數(shù)組只用開辟一次,有利于提高訪問速度;用malloc函數(shù)進(jìn)行動(dòng)態(tài)內(nèi)存申請時(shí),柔性數(shù)組的大小應(yīng)該大于結(jié)構(gòu)體的大小以便于柔性數(shù)組適應(yīng)預(yù)期大小。 --END--
-
內(nèi)存
+關(guān)注
關(guān)注
9文章
3238瀏覽量
76528 -
C語言
+關(guān)注
關(guān)注
183文章
7646瀏覽量
146201 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4422瀏覽量
67871 -
數(shù)組
+關(guān)注
關(guān)注
1文章
420瀏覽量
27476 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
131瀏覽量
11414
原文標(biāo)題:C語言|柔性數(shù)組
文章出處:【微信號:玩轉(zhuǎn)單片機(jī),微信公眾號:玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
C語言中數(shù)組的用法
c語言二維數(shù)組定義及其規(guī)則詳解
c語言之字符數(shù)組詳解
C語言數(shù)組詳解
C語言柔性數(shù)組詳解
評論