柔性數(shù)組在實際中應(yīng)用還是挺多的,看過上一篇文章分享一種靈活性很高的協(xié)議格式(附代碼例子)的小伙伴不知有沒有注意到我們有使用了柔性數(shù)組:
![02ba2d8e-29e2-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/62/wKgZomTnHsCAfebwAACcvFbc5mI756.png)
本篇文章我們就來一起學(xué)習(xí)柔性數(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)分配。
例子:
//微信公眾號:嵌入式大雜燴
#include
#include
#include
typedefstruct_data
{
intlen;
charval[];
}data_t;
intmain(intarc,char*argv[])
{
data_ttest_data1={0};
printf("sizeof(data_t)=%ld
",sizeof(data_t));
char*src_data="helloflexiblearr";
//為結(jié)構(gòu)體及其柔性數(shù)組成員申請一塊連續(xù)的空間
intlen=strlen(src_data)+1;
data_t*p_test_data2=(data_t*)malloc(sizeof(data_t)+sizeof(char)*len);
if(NULL==p_test_data2)
{
printf("mallocp_test_data2error
");
returnEXIT_FAILURE;
}
//填充結(jié)構(gòu)體
p_test_data2->len=len;
strncpy(p_test_data2->val,src_data,p_test_data2->len);
printf("p_test_data2->val=%s
",p_test_data2->val);
//釋放內(nèi)存
free(p_test_data2);
p_test_data2=NULL;
return0;
}
編譯、運行:
![02d5157c-29e2-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/62/wKgZomTnHsCAX5Z0AADXjfl7Gmw324.png)
下面我們一起通過實例來認(rèn)識柔性數(shù)組的優(yōu)點。
柔性數(shù)組與指針的區(qū)別?
上一節(jié)的協(xié)議格式結(jié)構(gòu)體其實可以又如下兩種創(chuàng)建方式:
- value字段以柔性數(shù)組的方式定義:
typedefstruct_protocol_format
{
uint16_thead;
uint8_tid;
uint8_ttype;
uint8_tlength;
uint8_tvalue[];
}protocol_format_t;
- value字段以指針的方式定義:
typedefstruct_protocol_format
{
uint16_thead;
uint8_tid;
uint8_ttype;
uint8_tlength;
uint8_t*value;
}protocol_format_t;
(1)結(jié)構(gòu)體占用空間
柔性數(shù)組的方式結(jié)構(gòu)體占用較指針的方式少。
柔性數(shù)組方式:
![02f9d02e-29e2-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/62/wKgZomTnHsCASi8iAAB3qCEgB3M656.png)
指針方式:
![0315dae4-29e2-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/62/wKgZomTnHsCAcBBuAAB5O5RtDmY471.png)
(2)代碼簡潔及訪問速度方面
柔性數(shù)組的方式相對與指針的方式更為簡潔,柔性數(shù)組的方式只需要申請一次空間,給結(jié)構(gòu)體申請空間的同時也給柔性數(shù)組申請空間;而指針的方式,除了給結(jié)構(gòu)體申請空間之外,還得給結(jié)構(gòu)體里的指針成員申請空間。
柔性數(shù)組方式:
![033113f4-29e2-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/62/wKgZomTnHsGAayNtAAKvGNP5m_Y234.png)
指針方式:
![035cc562-29e2-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/62/wKgZomTnHsGAUW_qAASQggBvyqc124.png)
使用指針的方式寫代碼會比柔性數(shù)組的方式會繁瑣一些,特別地,如果在釋放內(nèi)存的時候把順序弄反了,則結(jié)構(gòu)體里的指針成員所指向的內(nèi)存就釋放不掉,會造成內(nèi)存泄露。
柔性數(shù)組的方式只需要申請一次空間,是一塊連續(xù)的空間;而指針的方式,申請的兩塊空間不是連續(xù)的。連續(xù)的內(nèi)存有益于提高訪問速度。
當(dāng)然,前面介紹柔性數(shù)組的時候有說到,柔性數(shù)組是在C99標(biāo)準(zhǔn)及之后才有的,如果你的編譯器還是比較古老的,那還是選用指針的方式,通用性也會比較好。
以上就是本次的分享,期待你的點贊、收藏、轉(zhuǎn)發(fā)!
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5094文章
19184瀏覽量
307900 -
指針
+關(guān)注
關(guān)注
1文章
481瀏覽量
70612 -
數(shù)組
+關(guān)注
關(guān)注
1文章
417瀏覽量
26033 -
C99
+關(guān)注
關(guān)注
0文章
4瀏覽量
6215
原文標(biāo)題:如何在嵌入式項目中使用柔性數(shù)組?
文章出處:【微信號:工程師進(jìn)階筆記,微信公眾號:工程師進(jìn)階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
C語言數(shù)組和指針的區(qū)別
![C語言<b class='flag-5'>數(shù)組</b>和<b class='flag-5'>指針</b>的<b class='flag-5'>區(qū)別</b>](https://file1.elecfans.com/web2/M00/88/DB/wKgZomR1ZZmAbWULAACR9Zly394623.jpg)
C語言中指針數(shù)組和數(shù)組指針的區(qū)別
指針數(shù)組與數(shù)組指針的區(qū)別
指針數(shù)組與數(shù)組指針及其函數(shù)指針有何區(qū)別呢
指針和數(shù)組都是C語言的精髓所在 兩者有何聯(lián)系區(qū)別
![<b class='flag-5'>指針</b>和<b class='flag-5'>數(shù)組</b>都是C語言的精髓所在 兩者有何聯(lián)系<b class='flag-5'>區(qū)別</b>](https://file.elecfans.com/web1/M00/93/AF/pIYBAFzriUGAWvGnAAARj3TvPSw557.png)
評論