RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是柔性數(shù)組?柔性數(shù)組有何優(yōu)點(diǎn)

工程師鄧生 ? 來源:嵌入式大雜燴 ? 作者:ZhengNL ? 2022-09-14 10:34 ? 次閱讀

柔性數(shù)組在實(shí)際中應(yīng)用還是挺多的,看過上一篇文章分享一種靈活性很高的協(xié)議格式(附代碼例子)的小伙伴不知有沒有注意到我們有使用了柔性數(shù)組:

867e70b0-3371-11ed-ba43-dac502259ad0.png

本篇文章我們就來一起學(xué)習(xí)柔性數(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)分配。

例子:

//微信公眾號(hào):嵌入式大雜燴
#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ù)組成員申請(qǐng)一塊連續(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;
}

編譯、運(yùn)行:

8695daca-3371-11ed-ba43-dac502259ad0.png

下面我們一起通過實(shí)例來認(rèn)識(shí)柔性數(shù)組的優(yōu)點(diǎn)。

柔性數(shù)組與指針的區(qū)別?

上一節(jié)的協(xié)議格式結(jié)構(gòu)體其實(shí)可以又如下兩種創(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ù)組方式:

86a5feb4-3371-11ed-ba43-dac502259ad0.png

指針方式:

86b977be-3371-11ed-ba43-dac502259ad0.png

(2)代碼簡(jiǎn)潔及訪問速度方面

柔性數(shù)組的方式相對(duì)與指針的方式更為簡(jiǎn)潔,柔性數(shù)組的方式只需要申請(qǐng)一次空間,給結(jié)構(gòu)體申請(qǐng)空間的同時(shí)也給柔性數(shù)組申請(qǐng)空間;而指針的方式,除了給結(jié)構(gòu)體申請(qǐng)空間之外,還得給結(jié)構(gòu)體里的指針成員申請(qǐng)空間。

柔性數(shù)組方式:

86ccd46c-3371-11ed-ba43-dac502259ad0.png

指針方式:

86e4f7f4-3371-11ed-ba43-dac502259ad0.png

使用指針的方式寫代碼會(huì)比柔性數(shù)組的方式會(huì)繁瑣一些,特別地,如果在釋放內(nèi)存的時(shí)候把順序弄反了,則結(jié)構(gòu)體里的指針成員所指向的內(nèi)存就釋放不掉,會(huì)造成內(nèi)存泄露。

柔性數(shù)組的方式只需要申請(qǐng)一次空間,是一塊連續(xù)的空間;而指針的方式,申請(qǐng)的兩塊空間不是連續(xù)的。連續(xù)的內(nèi)存有益于提高訪問速度。

當(dāng)然,前面介紹柔性數(shù)組的時(shí)候有說到,柔性數(shù)組是在C99標(biāo)準(zhǔn)及之后才有的,如果你的編譯器還是比較古老的,那還是選用指針的方式,通用性也會(huì)比較好。




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70551
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1623

    瀏覽量

    49108
  • C99
    C99
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    6159

原文標(biāo)題:柔性數(shù)組在實(shí)際項(xiàng)目中的應(yīng)用?

文章出處:【微信號(hào):wenzi嵌入式軟件,微信公眾號(hào):wenzi嵌入式軟件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)組的下標(biāo)為什么可以是負(fù)數(shù)

    最近有同學(xué)發(fā)來這樣一段代碼,并提出一個(gè)問題,數(shù)組的下標(biāo)為什么可以是負(fù)數(shù)? ? ? #include int main(){ const char *s = "helloworld"; const
    的頭像 發(fā)表于 12-20 11:18 ?54次閱讀

    柔性電子技術(shù)和智能面膜 #柔性電子 #印刷電子 #綠展科技

    柔性電子
    綠展科技
    發(fā)布于 :2024年11月28日 20:16:50

    指針數(shù)組和二維數(shù)組有沒有區(qū)別

    。 首先是指針數(shù)組 s1。 s1 本身是個(gè)一維數(shù)組數(shù)組三個(gè)元素,每個(gè)元素都是個(gè)指針。如果是 64 位系統(tǒng),三個(gè)指針就占了 24 個(gè)字節(jié)。 使用 sizeof 計(jì)算 s1 的大小,結(jié)
    的頭像 發(fā)表于 11-24 11:12 ?139次閱讀

    C語言數(shù)組應(yīng)用計(jì)算機(jī)導(dǎo)論A第6講:數(shù)組

    C語言數(shù)組應(yīng)用計(jì)算機(jī)導(dǎo)論A第6講:數(shù)組
    發(fā)表于 11-20 15:33 ?0次下載

    labview字符串數(shù)組轉(zhuǎn)化為數(shù)值數(shù)組

    在LabVIEW中,將字符串數(shù)組轉(zhuǎn)換為數(shù)值數(shù)組是一項(xiàng)常見的任務(wù),尤其是在處理數(shù)據(jù)采集、信號(hào)處理或用戶輸入時(shí)。 1. 理解LabVIEW的數(shù)據(jù)類型 在開始之前,了解LabVIEW中的數(shù)據(jù)類型是非
    的頭像 發(fā)表于 09-04 17:47 ?2246次閱讀

    深入探索KUKA KRL中的數(shù)組應(yīng)用

    如果 CHAR 類型數(shù)組的所有數(shù)組元素都擁有相同的字符串,則不必單獨(dú)初始化每個(gè)數(shù)組元素。忽略右側(cè)的數(shù)組下標(biāo)。(對(duì)于一維數(shù)組下標(biāo),不寫下標(biāo)。)
    的頭像 發(fā)表于 04-18 10:37 ?1229次閱讀
    深入探索KUKA KRL中的<b class='flag-5'>數(shù)組</b>應(yīng)用

    鴻蒙TypeScript入門學(xué)習(xí)第11天【Array(數(shù)組)】

    數(shù)組對(duì)象是使用單獨(dú)的變量名來存儲(chǔ)一系列的值。 數(shù)組非常常用。
    的頭像 發(fā)表于 04-09 14:38 ?1134次閱讀
    鴻蒙TypeScript入門學(xué)習(xí)第11天【Array(<b class='flag-5'>數(shù)組</b>)】

    柔性電流探頭的優(yōu)缺點(diǎn)哪些?

    柔性電流探頭是一種先進(jìn)的電氣檢測(cè)技術(shù),它具有獨(dú)特的優(yōu)點(diǎn)和一些局限性。在本文中,我們將深入探討柔性電流探頭的優(yōu)缺點(diǎn),為您揭開這一新興技術(shù)的神秘面紗。 一、柔性電流探頭的
    的頭像 發(fā)表于 03-01 11:24 ?625次閱讀
    <b class='flag-5'>柔性</b>電流探頭的優(yōu)缺點(diǎn)<b class='flag-5'>有</b>哪些?

    數(shù)組和鏈表在內(nèi)存中的區(qū)別 數(shù)組和鏈表的優(yōu)缺點(diǎn)

    數(shù)組和鏈表在內(nèi)存中的區(qū)別 數(shù)組和鏈表的優(yōu)缺點(diǎn)? 數(shù)組和鏈表是常見的數(shù)據(jù)結(jié)構(gòu),用于組織和存儲(chǔ)數(shù)據(jù)。它們?cè)趦?nèi)存中的存儲(chǔ)方式以及優(yōu)缺點(diǎn)方面存在一些顯著的差異。本文將詳細(xì)探討這些差異以及它們的優(yōu)缺點(diǎn)。 1.
    的頭像 發(fā)表于 02-21 11:30 ?1021次閱讀

    數(shù)組和鏈表區(qū)別

    數(shù)組和鏈表的區(qū)別,這個(gè)問題,不僅面試中經(jīng)常遇到,考研的同學(xué)也得掌握才行。
    的頭像 發(fā)表于 02-19 15:33 ?502次閱讀
    <b class='flag-5'>數(shù)組</b>和鏈表<b class='flag-5'>有</b><b class='flag-5'>何</b>區(qū)別

    PHP中數(shù)組的使用方法!

    PHP中數(shù)組的使用方法! PHP是一種廣泛使用的網(wǎng)絡(luò)編程語言,它的數(shù)組功能非常強(qiáng)大且靈活。數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),它允許我們?cè)趩蝹€(gè)變量中存儲(chǔ)多個(gè)值。 在本篇文章中,我將詳細(xì)解釋PHP數(shù)組
    的頭像 發(fā)表于 01-12 15:11 ?540次閱讀

    labview怎么查數(shù)組中相同元素的個(gè)數(shù)

    要查找LabVIEW中數(shù)組中相同元素的個(gè)數(shù),可以使用以下步驟: 創(chuàng)建一個(gè)包含要查找的數(shù)值的數(shù)組。這可以通過手動(dòng)輸入數(shù)組元素或從文件/其他數(shù)據(jù)源導(dǎo)入數(shù)組實(shí)現(xiàn)。 使用“For Loop”結(jié)
    的頭像 發(fā)表于 12-28 16:42 ?3481次閱讀

    一文帶你認(rèn)識(shí)柔性電流探頭(羅氏線圈)

    、60Hz的PLC正弦電流。柔性電流探頭(羅氏線圈)一個(gè)靈活的夾式傳感器線圈,可以很容易地纏繞在載流導(dǎo)體上進(jìn)行測(cè)量,并且可以測(cè)量非常大的電流,也不會(huì)增加傳感器的尺寸。   目前,柔性電流探頭(羅氏線圈)電流
    發(fā)表于 12-28 10:57
    RM新时代网站-首页