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

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

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

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

我快閉嘴 ? 來(lái)源:嵌入式大雜燴 ? 作者:ZhengNL ? 2022-09-02 15:32 ? 次閱讀

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

02ba2d8e-29e2-11ed-ba43-dac502259ad0.png

本篇文章我們就來(lái)一起學(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)行:

02d5157c-29e2-11ed-ba43-dac502259ad0.png

下面我們一起通過(guò)實(shí)例來(lái)認(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ù)組方式:

02f9d02e-29e2-11ed-ba43-dac502259ad0.png

指針?lè)绞剑?/strong>

0315dae4-29e2-11ed-ba43-dac502259ad0.png

(2)代碼簡(jiǎn)潔及訪問(wè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ù)組方式:

033113f4-29e2-11ed-ba43-dac502259ad0.png

指針?lè)绞剑?/strong>

035cc562-29e2-11ed-ba43-dac502259ad0.png

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

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

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

以上就是本次的分享,期待你的點(diǎn)贊、收藏、轉(zhuǎn)發(fā)!

審核編輯:湯梓紅


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

    關(guān)注

    5046

    文章

    18838

    瀏覽量

    299105
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    475

    瀏覽量

    70463
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    411

    瀏覽量

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

    關(guān)注

    0

    文章

    4

    瀏覽量

    6083

原文標(biāo)題:如何在嵌入式項(xiàng)目中使用柔性數(shù)組?

文章出處:【微信號(hào):工程師進(jìn)階筆記,微信公眾號(hào):工程師進(jìn)階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言數(shù)組指針區(qū)別

    大家好,我是嵌入式老林,從事嵌入式軟件開(kāi)發(fā)多年,今天分享的內(nèi)容是C語(yǔ)言數(shù)組指針區(qū)別,希望能對(duì)你有所幫助。
    發(fā)表于 07-11 12:40 ?338次閱讀
    C語(yǔ)言<b class='flag-5'>數(shù)組</b>和<b class='flag-5'>指針</b>的<b class='flag-5'>區(qū)別</b>

    C語(yǔ)言中指針數(shù)組數(shù)組指針區(qū)別

    指針數(shù)組之間存在著緊密的關(guān)系。在本文中,我們將探討指針數(shù)組的關(guān)系、指針算術(shù)和數(shù)組遍歷、多維
    發(fā)表于 08-17 15:29 ?369次閱讀

    指針數(shù)組數(shù)組指針區(qū)別

    int (*p)[4];// 定義一個(gè)數(shù)組指針,指向含4個(gè)元素的一維數(shù)組,數(shù)組元素是int類(lèi)型。int *p[4];// 定義一個(gè)指針
    發(fā)表于 07-15 21:41

    指針數(shù)組數(shù)組指針及其函數(shù)指針有何區(qū)別

    進(jìn)程的五種狀態(tài)模型分別是哪些呢?指針數(shù)組數(shù)組指針及其函數(shù)指針有何區(qū)別呢?
    發(fā)表于 12-24 07:28

    指針數(shù)組數(shù)組指針有什么區(qū)別和聯(lián)系呢

    什么是指針數(shù)組數(shù)組指針?指針數(shù)組數(shù)組
    發(fā)表于 12-24 06:55

    指針數(shù)組都是C語(yǔ)言的精髓所在 兩者有何聯(lián)系區(qū)別

    指針數(shù)組都是C語(yǔ)言的精髓所在,對(duì)于很多C程序員來(lái)說(shuō),如果你問(wèn)這樣一個(gè)問(wèn)題:數(shù)組指針有什么區(qū)別?他們的答案很可能是:”
    的頭像 發(fā)表于 05-27 14:51 ?3887次閱讀
    <b class='flag-5'>指針</b>和<b class='flag-5'>數(shù)組</b>都是C語(yǔ)言的精髓所在 兩者有何聯(lián)系<b class='flag-5'>區(qū)別</b>

    詳談數(shù)組指針區(qū)別與聯(lián)系

    詳談數(shù)組指針區(qū)別與聯(lián)系
    的頭像 發(fā)表于 06-29 15:18 ?2.2w次閱讀
    詳談<b class='flag-5'>數(shù)組</b>和<b class='flag-5'>指針</b>的<b class='flag-5'>區(qū)別</b>與聯(lián)系

    指針數(shù)組數(shù)組指針區(qū)別

    這里我們區(qū)分兩個(gè)重要的概念:指針數(shù)組、數(shù)組指針。
    的頭像 發(fā)表于 06-29 15:30 ?1.9w次閱讀
    <b class='flag-5'>指針</b><b class='flag-5'>數(shù)組</b>和<b class='flag-5'>數(shù)組</b><b class='flag-5'>指針</b>的<b class='flag-5'>區(qū)別</b>

    理解函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組指針

    理解函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組指針
    的頭像 發(fā)表于 06-29 15:38 ?1.5w次閱讀
    理解函數(shù)<b class='flag-5'>指針</b>、函數(shù)<b class='flag-5'>指針</b><b class='flag-5'>數(shù)組</b>、函數(shù)<b class='flag-5'>指針</b><b class='flag-5'>數(shù)組</b>的<b class='flag-5'>指針</b>

    C語(yǔ)言指針數(shù)組區(qū)別

    在C語(yǔ)言教程中我們使用通過(guò)數(shù)組名通過(guò)偏移和指針偏移都可以遍歷數(shù)組,那么指針數(shù)組到底有什么區(qū)別?
    的頭像 發(fā)表于 07-18 16:29 ?1801次閱讀

    二維數(shù)組數(shù)組指針以及指針數(shù)組

    二維數(shù)組數(shù)組指針以及指針數(shù)組
    的頭像 發(fā)表于 08-16 09:02 ?2507次閱讀

    C語(yǔ)言中的char數(shù)組和char指針有什么區(qū)別?

    讓我們通過(guò)下面的例子,來(lái)了解 C語(yǔ)言中字符數(shù)組和字符指針之間的區(qū)別
    的頭像 發(fā)表于 01-29 16:35 ?2372次閱讀

    數(shù)組指針不能混用的情況

    數(shù)組指針不能混用的情況? 數(shù)組指針是 C/C++ 中非常常見(jiàn)的特性和概念。然而,在某些情況下,數(shù)組
    的頭像 發(fā)表于 12-07 13:46 ?495次閱讀

    數(shù)組指針不相同嗎?數(shù)組指針有哪些區(qū)別

    數(shù)組就是指針指針就是數(shù)組,這樣的言論在評(píng)論區(qū)看到不下于10次。
    的頭像 發(fā)表于 12-13 16:34 ?967次閱讀
    <b class='flag-5'>數(shù)組</b>和<b class='flag-5'>指針</b>不相同嗎?<b class='flag-5'>數(shù)組</b>和<b class='flag-5'>指針</b>有哪些<b class='flag-5'>區(qū)別</b>

    面試常考+1:函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組

    在嵌入式開(kāi)發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針指針數(shù)組是一些非常重要但又容易混淆的概念。理解它
    的頭像 發(fā)表于 08-10 08:11 ?365次閱讀
    面試???1:函數(shù)<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>函數(shù)、<b class='flag-5'>數(shù)組</b><b class='flag-5'>指針</b>與<b class='flag-5'>指針</b><b class='flag-5'>數(shù)組</b>