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

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

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

零長(zhǎng)數(shù)組如何使用定長(zhǎng)包定義數(shù)據(jù)緩沖區(qū)

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux充電站 ? 作者:Vincent ? 2023-09-27 14:58 ? 次閱讀

零長(zhǎng)數(shù)組

請(qǐng)先思考以下問(wèn)題:

  • C語(yǔ)言中,數(shù)組長(zhǎng)度是否可以為0?
  • 如果要接收一個(gè)不定長(zhǎng)數(shù)據(jù)包,你會(huì)如何定義數(shù)據(jù)緩沖區(qū)?

第一個(gè)問(wèn)題

在標(biāo)準(zhǔn)C語(yǔ)言中,沒(méi)有長(zhǎng)度為0的數(shù)組,但在 GNU C語(yǔ)言中,數(shù)組長(zhǎng)度可以為0 ,這是GNU對(duì)C語(yǔ)言的擴(kuò)展。

先對(duì)零長(zhǎng)數(shù)組做個(gè)介紹:

零長(zhǎng)數(shù)組 :也叫柔性數(shù)組(變長(zhǎng)數(shù)組)

  • 用途 : 長(zhǎng)度為0的數(shù)組的主要用途是為了滿足需要變長(zhǎng)度的結(jié)構(gòu)體
  • 用法 : 在一個(gè)結(jié)構(gòu)體的最后, 申明一個(gè)長(zhǎng)度為0的數(shù)組, 就可以使得這個(gè) 結(jié)構(gòu)體是可變長(zhǎng)的 。

對(duì)于編譯器來(lái)說(shuō), 此時(shí) 長(zhǎng)度為0的數(shù)組并不占用空間 , 因?yàn)閿?shù)組名本身不占空間, 它只是一個(gè)偏移量, 數(shù)組名這個(gè)符號(hào)本身代表了一個(gè)不可修改的 地址常量 。

第二個(gè)問(wèn)題

通常定義一個(gè)不定長(zhǎng)數(shù)據(jù)包的緩沖區(qū),有兩種常用方法:

  • 定長(zhǎng)數(shù)據(jù)緩沖區(qū) , 設(shè)置一個(gè)足夠大小 MAX_LENGTH 的數(shù)據(jù)緩沖區(qū)
  • 設(shè)置一個(gè)指向?qū)嶋H數(shù)據(jù)的指針 , 每次使用時(shí), 按照數(shù)據(jù)的長(zhǎng)度動(dòng)態(tài)的開辟數(shù)據(jù)緩沖區(qū)的空間

下面依次分析使用 定長(zhǎng)包 、指針數(shù)據(jù)包和使用零長(zhǎng)數(shù)組三種方式的不同。

定長(zhǎng)包

假設(shè)我們要在網(wǎng)絡(luò)中接收一個(gè)長(zhǎng)度為1024字節(jié)的數(shù)據(jù),怎么定義數(shù)據(jù)緩沖區(qū)呢?

定義一個(gè)數(shù)據(jù)緩沖區(qū)結(jié)構(gòu)體data_buf,成員包含數(shù)據(jù)長(zhǎng)度len和數(shù)據(jù)內(nèi)容data

  • 數(shù)據(jù)結(jié)構(gòu)定義
struct data_buf{
 int len;
 char data[MAX_LENGTH];
}
  • 數(shù)據(jù)結(jié)構(gòu)大小

數(shù)據(jù)內(nèi)容放在data數(shù)組中,數(shù)據(jù)最大長(zhǎng)度限制為MAX_LENGTH字節(jié),以滿足接收數(shù)據(jù)的需求。

考慮對(duì)齊, 那么數(shù)據(jù)結(jié)構(gòu)的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH

但是,通常情況下,我們接收的數(shù)據(jù)不會(huì)達(dá)到最大長(zhǎng)度,假設(shè)MAX_LENGTH=2048,那么接收1024字節(jié)內(nèi)容,還有1024字節(jié)空間就浪費(fèi)了。

  • 數(shù)據(jù)包創(chuàng)建

當(dāng)接收到數(shù)據(jù)時(shí),使用malloc動(dòng)態(tài)分配內(nèi)存。一般來(lái)說(shuō), 我們會(huì)返回一個(gè)指向緩沖區(qū)數(shù)據(jù)結(jié)構(gòu) data_buf 的指針:

///  開辟
    if ((mbuffer = (struct data_buf *)malloc(sizeof(struct data_buf))) != NULL)
    {
        mbuffer- >len = CURR_LENGTH;//CURR_LENGTH為接收到的數(shù)據(jù)長(zhǎng)度
        memcpy(mbuffer- >data, "Hello World", CURR_LENGTH);


        printf("%d, %sn", mbuffer- >len, mbuffer- >data);
    }
  • 釋放
/// 銷毀
free(mbuffer);
mbuffer = NULL;
  • 優(yōu)點(diǎn) :使用簡(jiǎn)單,內(nèi)存的開辟和釋放簡(jiǎn)單
  • 缺點(diǎn) :使用定長(zhǎng)數(shù)組作為數(shù)據(jù)緩沖區(qū), 為了避免造成緩沖區(qū)溢出, 數(shù)組的大小一般設(shè)為足夠的空間 MAX_LENGTH, 而實(shí)際使用過(guò)程中, 達(dá)到 MAX_LENGTH 長(zhǎng)度的數(shù)據(jù)很少, 那么多數(shù)情況下, 緩沖區(qū)的大部分空間都是浪費(fèi)掉的.
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6722

    瀏覽量

    88331
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134360
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    569

    瀏覽量

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

    關(guān)注

    1

    文章

    411

    瀏覽量

    25835
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式中零長(zhǎng)度數(shù)組基本操作方法

    C語(yǔ)言零長(zhǎng)度數(shù)組,聽起來(lái)可能有點(diǎn)奇怪,因?yàn)樗鼪](méi)有分配內(nèi)存空間,無(wú)法存儲(chǔ)數(shù)據(jù)。但實(shí)際上,零長(zhǎng)度數(shù)組在Linux內(nèi)核中隨處可見。 零長(zhǎng)度數(shù)組定義
    的頭像 發(fā)表于 05-11 08:49 ?733次閱讀
    嵌入式中<b class='flag-5'>零長(zhǎng)度數(shù)組</b>基本操作方法

    在AN65974中短數(shù)據(jù)包零長(zhǎng)數(shù)據(jù)包是什么意思?

    在 AN65974 中,短數(shù)據(jù)包零長(zhǎng)數(shù)據(jù)包是什么意思? 非常感謝!
    發(fā)表于 05-30 07:41

    緩沖區(qū)數(shù)據(jù)如何轉(zhuǎn)換成數(shù)組

    各位高手,請(qǐng)問(wèn)下我從儀器中讀取出來(lái)數(shù)據(jù)緩沖區(qū)后,如何能把這些數(shù)據(jù)轉(zhuǎn)換成一個(gè)數(shù)組,格式應(yīng)該怎樣去轉(zhuǎn)換。。。。半天也弄不出來(lái) 幫幫忙吧先謝謝大家了。。。
    發(fā)表于 02-22 17:05

    請(qǐng)問(wèn)串口DMA+環(huán)形緩沖區(qū)如何實(shí)現(xiàn)不定長(zhǎng)度的數(shù)據(jù)收發(fā)?

    請(qǐng)問(wèn)串口DMA+環(huán)形緩沖區(qū)如何實(shí)現(xiàn)不定長(zhǎng)度的數(shù)據(jù)收發(fā)?
    發(fā)表于 12-08 06:13

    怎樣去使用STM32串口驅(qū)動(dòng)不定長(zhǎng)數(shù)據(jù)接收帶環(huán)形緩沖區(qū)

    怎樣去使用STM32串口驅(qū)動(dòng)不定長(zhǎng)數(shù)據(jù)接收帶環(huán)形緩沖區(qū)呢?有哪些注意事項(xiàng)?
    發(fā)表于 12-08 08:08

    環(huán)形緩沖區(qū)的實(shí)現(xiàn)原理

    在通信程序中,經(jīng)常使用環(huán)形緩沖區(qū)作為數(shù)據(jù)結(jié)構(gòu)來(lái)存放通信中發(fā)送和接收的數(shù)據(jù)。環(huán)形緩沖區(qū)是一個(gè)先進(jìn)先出的循環(huán)緩沖區(qū),可以向通信程序提供對(duì)
    的頭像 發(fā)表于 03-22 10:03 ?7415次閱讀
    環(huán)形<b class='flag-5'>緩沖區(qū)</b>的實(shí)現(xiàn)原理

    緩沖區(qū)是啥意思 STM32串口數(shù)據(jù)接收之環(huán)形緩沖區(qū)

    緩沖區(qū)顧名思義是緩沖數(shù)據(jù)用的。實(shí)現(xiàn)緩沖區(qū)最簡(jiǎn)單的辦法時(shí),定義多個(gè)數(shù)組,接收一
    的頭像 發(fā)表于 07-22 15:33 ?1.1w次閱讀

    日常編程中柔性數(shù)組定義和應(yīng)用

    ? 1 引言 定長(zhǎng)數(shù)組 在平時(shí)的開發(fā)中,緩沖區(qū)數(shù)據(jù)收發(fā)時(shí),如果采用緩沖區(qū)
    的頭像 發(fā)表于 11-11 14:51 ?1246次閱讀

    STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)

    STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)環(huán)形緩沖區(qū)簡(jiǎn)介??在單片機(jī)中串口通信是我們使用最頻繁的,使用串口通信就會(huì)用到串口的數(shù)據(jù)接收與發(fā)送,環(huán)形緩沖區(qū)
    發(fā)表于 12-28 19:24 ?30次下載
    STM32串口<b class='flag-5'>數(shù)據(jù)</b>接收 --環(huán)形<b class='flag-5'>緩沖區(qū)</b>

    環(huán)形緩沖區(qū)的實(shí)現(xiàn)思路

    單片機(jī)程序開發(fā)一般都會(huì)用到UART串口通信,通過(guò)通信來(lái)實(shí)現(xiàn)上位機(jī)和單片機(jī)程序的數(shù)據(jù)交互。通信中為了實(shí)現(xiàn)正常的收發(fā),一般都會(huì)有對(duì)應(yīng)的發(fā)送和接收緩存來(lái)暫存通信數(shù)據(jù)。這里使用環(huán)形緩沖區(qū)的方式來(lái)設(shè)計(jì)數(shù)
    的頭像 發(fā)表于 01-17 15:07 ?1488次閱讀

    如何使用指針數(shù)據(jù)包定義數(shù)據(jù)緩沖區(qū)

    指針數(shù)據(jù)包 相信大多數(shù)人會(huì)將定長(zhǎng)數(shù)組換為 指針 , 每次使用時(shí)動(dòng)態(tài)的開辟 CURR_LENGTH 大小的空間, 因?yàn)檫@樣可以避免造成 MAX_LENGTH - CURR_LENGTH 空間的浪費(fèi)
    的頭像 發(fā)表于 09-27 15:01 ?402次閱讀

    變長(zhǎng)數(shù)據(jù)包數(shù)據(jù)結(jié)構(gòu)定義

    用方便的呢? GNU C 的0長(zhǎng)度數(shù)組(變長(zhǎng)數(shù)組/柔性數(shù)組)就是這樣一個(gè)擴(kuò)展. 對(duì)于 0長(zhǎng)數(shù)組 的這個(gè)特點(diǎn),很容易構(gòu)造出變成結(jié)構(gòu)體,如
    的頭像 發(fā)表于 09-27 15:08 ?602次閱讀

    C++環(huán)形緩沖區(qū)設(shè)計(jì)與實(shí)現(xiàn)

    一、環(huán)形緩沖區(qū)基礎(chǔ)理論解析(Basic Theory of Circular Buffer) 1.1 環(huán)形緩沖區(qū)定義與作用(Definition and Function of Circular
    的頭像 發(fā)表于 11-09 11:21 ?1326次閱讀
    C++環(huán)形<b class='flag-5'>緩沖區(qū)</b>設(shè)計(jì)與實(shí)現(xiàn)

    交換機(jī)與路由器緩沖區(qū):尋找完美大小

    學(xué)術(shù)界和工業(yè)界一直備受爭(zhēng)議。本文探討了高端路由器中數(shù)據(jù)包緩沖的歷史和演變,以期概述當(dāng)前的實(shí)踐和未來(lái)的趨勢(shì)。 網(wǎng)絡(luò)芯片中的緩沖區(qū) 在典型的路由器/交換機(jī) ASIC 中,會(huì)發(fā)現(xiàn)三種類型的數(shù)據(jù)包
    的頭像 發(fā)表于 04-11 16:56 ?774次閱讀
    交換機(jī)與路由器<b class='flag-5'>緩沖區(qū)</b>:尋找完美大小

    單片機(jī)中的幾種環(huán)形緩沖區(qū)的分析和實(shí)現(xiàn)

    單片機(jī)中的幾種環(huán)形緩沖區(qū)的分析和實(shí)現(xiàn)一、簡(jiǎn)介環(huán)形緩沖區(qū)(RingBuffer)是一種高效的使用內(nèi)存的方法,它將一段固定長(zhǎng)度的內(nèi)存看成一個(gè)環(huán)形結(jié)構(gòu),用于存儲(chǔ)數(shù)據(jù),能夠避免使用動(dòng)態(tài)申請(qǐng)內(nèi)存
    的頭像 發(fā)表于 08-14 08:39 ?382次閱讀
    單片機(jī)中的幾種環(huán)形<b class='flag-5'>緩沖區(qū)</b>的分析和實(shí)現(xiàn)