柔性數(shù)組在實際中應用還是挺多的,看過上一篇文章分享一種靈活性很高的協(xié)議格式(附代碼例子)的小伙伴不知有沒有注意到我們有使用了柔性數(shù)組:
本篇文章我們就來一起學習柔性數(shù)組。
什么是柔性數(shù)組?
C99中,結構體中的最后一個元素允許是未知大小的數(shù)組,這就叫作 柔性數(shù)組 。
柔性數(shù)組的特點:
- 結構體中柔性數(shù)組成員前面必須至少有一個其他成員。
- sizeof返回的這種結構大小不包括柔性數(shù)組的內存。
- 包含柔性數(shù)組成員的結構用malloc()函數(shù)進行內存的動態(tài)分配。
例子:
// 微信公眾號:嵌入式大雜燴 #include #include #include typedef struct _data { int len; char val[];
}data_t; int main(int arc, char *argv[]) { data_t test_data1 = {0}; printf("sizeof(data_t) = %ld\n", sizeof(data_t)); char *src_data = "hello flexible arr"; // 為結構體及其柔性數(shù)組成員申請一塊連續(xù)的空間 int len = strlen(src_data) + 1; data_t *p_test_data2 =(data_t*)malloc(sizeof(data_t) + sizeof(char) * len); if (NULL == p_test_data2)
{ printf("malloc p_test_data2 error\n"); return EXIT_FAILURE;
} // 填充結構體 p_test_data2->len = len; strncpy(p_test_data2->val, src_data, p_test_data2->len); printf("p_test_data2->val = %s\n", p_test_data2->val); // 釋放內存 free(p_test_data2);
p_test_data2 = NULL; return 0;
}
編譯、運行:
下面我們一起通過實例來認識柔性數(shù)組的優(yōu)點。
柔性數(shù)組與指針的區(qū)別?
上一節(jié)的協(xié)議格式結構體其實可以又如下兩種創(chuàng)建方式:
-
value字段以柔性數(shù)組的方式定義:
typedef struct _protocol_format { uint16_t head; uint8_t id; uint8_t type; uint8_t length; uint8_t value[];
}protocol_format_t;
-
value字段以指針的方式定義:
typedef struct _protocol_format { uint16_t head; uint8_t id; uint8_t type; uint8_t length; uint8_t *value;
}protocol_format_t;
(1)結構體占用空間
柔性數(shù)組的方式結構體占用較指針的方式少。
柔性數(shù)組方式:
指針方式:
(2)代碼簡潔及訪問速度方面
柔性數(shù)組的方式相對與指針的方式更為簡潔,柔性數(shù)組的方式只需要申請一次空間,給結構體申請空間的同時也給柔性數(shù)組申請空間;而指針的方式,除了給結構體申請空間之外,還得給結構體里的指針成員申請空間。
柔性數(shù)組方式:
指針方式:
使用指針的方式寫代碼會比柔性數(shù)組的方式會繁瑣一些,特別地,如果在釋放內存的時候把順序弄反了,則結構體里的指針成員所指向的內存就釋放不掉,會造成內存泄露。
柔性數(shù)組的方式只需要申請一次空間,是一塊連續(xù)的空間;而指針的方式,申請的兩塊空間不是連續(xù)的。連續(xù)的內存有益于提高訪問速度。
當然,前面介紹柔性數(shù)組的時候有說到,柔性數(shù)組是在C99標準及之后才有的,如果你的編譯器還是比較古老的,那還是選用指針的方式,通用性也會比較好。
以上就是本次的分享,期待你的點贊、收藏、轉發(fā)!
注意
由于微信公眾號近期改變了推送規(guī)則,為了防止找不到,可以星標置頂,這樣每次推送的文章才會出現(xiàn)在您的訂閱列表里。
猜你喜歡:
分享一種靈活性很高的協(xié)議格式(附代碼例子)
嵌入式大雜燴周記 | 第 15 期
訪問非法內存為什么不會出錯?
嵌入式大雜燴周記 | 第 14 期
分享幾個實用的代碼片段(第二彈)
分享一種你可能不知道的bug定位方法
分享一種修改配置文件的方法
《嵌入式大雜燴周記第 13 期:lz4》
《嵌入式并行多線程處理器,了解一下!》
《分享一種修改配置文件的方法》
《分享幾個實用的代碼片段(附代碼例子)》
《廢舊板子再利用:搭建無線調試環(huán)境!》
《嵌入式段錯誤的3種調試方法匯總!》
《簡說TCP通信非阻塞接收(附代碼例子)》
《TCP通信常用接口的使用封裝》
《寫國際化的嵌入式代碼,時間問題如何處理?》
《Linux命令行萬能解壓命令》
《嵌入式軟件中,總線錯誤的坑?替大家先踩一步》
《分享嵌入式軟件調試方法及幾個有用的工具!》
《分享兩點提高編程能力的建議!》
在公眾號聊天界面回復1024,可獲取嵌入式資源;回復 m ,可查看文章匯總