下班寫文章難免會有些出錯,也感謝那些在后臺留言指出錯誤的讀者;表驅那篇推文存在數組越界問題,可以通過預先開辟一個大數組的方式解決,但這樣解決方式會存在資源浪費問題,如果想不浪費資源來解決數組溢出的問題,那就來看看柔性數組怎么樣!
|簡單介紹
C99中,結構體中的最后一個元素允許是未知大小的數組,這就叫作 柔性數組 。 柔性數組的特點:
結構體中柔性數組成員前面必須至少有一個其他成員。
sizeof返回的這種結構大小不包括柔性數組的內存。
包含柔性數組成員的結構用malloc()函數進行內存的動態分配。
#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() { //為結構體及其柔性數組成員申請一塊連續的空間 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(" "); //重新調整所申請的空間,將柔性數組調整為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(" "); //釋放內存 free(p); p=NULL; return 0; }
| 優勢總結
柔性數組的特點在于只需要用一次malloc創建就可以,而且和結構體是在同一塊連續的空間,對比在結構體中放指針成員而言,可以減少內存碎片化,因為malloc申請的內存位置是任意的;柔性數組申請的內存更加集中,有利于查找使用;柔性數組只用開辟一次,有利于提高訪問速度;用malloc函數進行動態內存申請時,柔性數組的大小應該大于結構體的大小以便于柔性數組適應預期大小。 --END--
-
內存
+關注
關注
8文章
3020瀏覽量
74014 -
C語言
+關注
關注
180文章
7604瀏覽量
136714 -
函數
+關注
關注
3文章
4329瀏覽量
62576 -
數組
+關注
關注
1文章
417瀏覽量
25940 -
結構體
+關注
關注
1文章
130瀏覽量
10840
原文標題:C語言|柔性數組
文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論