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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

零長數組如何使用定長包定義數據緩沖區(qū)

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

零長數組

請先思考以下問題:

  • C語言中,數組長度是否可以為0?
  • 如果要接收一個不定長數據包,你會如何定義數據緩沖區(qū)?

第一個問題

在標準C語言中,沒有長度為0的數組,但在 GNU C語言中,數組長度可以為0 ,這是GNU對C語言的擴展。

先對零長數組做個介紹:

零長數組 :也叫柔性數組(變長數組)

  • 用途 : 長度為0的數組的主要用途是為了滿足需要變長度的結構體
  • 用法 : 在一個結構體的最后, 申明一個長度為0的數組, 就可以使得這個 結構體是可變長的 。

對于編譯器來說, 此時 長度為0的數組并不占用空間 , 因為數組名本身不占空間, 它只是一個偏移量, 數組名這個符號本身代表了一個不可修改的 地址常量 。

第二個問題

通常定義一個不定長數據包的緩沖區(qū),有兩種常用方法:

  • 定長數據緩沖區(qū) , 設置一個足夠大小 MAX_LENGTH 的數據緩沖區(qū)
  • 設置一個指向實際數據的指針 , 每次使用時, 按照數據的長度動態(tài)的開辟數據緩沖區(qū)的空間

下面依次分析使用 定長包指針數據包和使用零長數組三種方式的不同。

定長包

假設我們要在網絡中接收一個長度為1024字節(jié)的數據,怎么定義數據緩沖區(qū)呢?

定義一個數據緩沖區(qū)結構體data_buf,成員包含數據長度len和數據內容data

  • 數據結構定義
struct data_buf{
 int len;
 char data[MAX_LENGTH];
}
  • 數據結構大小

數據內容放在data數組中,數據最大長度限制為MAX_LENGTH字節(jié),以滿足接收數據的需求。

考慮對齊, 那么數據結構的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH

但是,通常情況下,我們接收的數據不會達到最大長度,假設MAX_LENGTH=2048,那么接收1024字節(jié)內容,還有1024字節(jié)空間就浪費了。

  • 數據包創(chuàng)建

當接收到數據時,使用malloc動態(tài)分配內存。一般來說, 我們會返回一個指向緩沖區(qū)數據結構 data_buf 的指針:

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


        printf("%d, %sn", mbuffer- >len, mbuffer- >data);
    }
  • 釋放
/// 銷毀
free(mbuffer);
mbuffer = NULL;
  • 優(yōu)點 :使用簡單,內存的開辟和釋放簡單
  • 缺點 :使用定長數組作為數據緩沖區(qū), 為了避免造成緩沖區(qū)溢出, 數組的大小一般設為足夠的空間 MAX_LENGTH, 而實際使用過程中, 達到 MAX_LENGTH 長度的數據很少, 那么多數情況下, 緩沖區(qū)的大部分空間都是浪費掉的.
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6762

    瀏覽量

    88626
  • C語言
    +關注

    關注

    180

    文章

    7581

    瀏覽量

    135600
  • 數據結構
    +關注

    關注

    3

    文章

    569

    瀏覽量

    40063
  • 數組
    +關注

    關注

    1

    文章

    412

    瀏覽量

    25862
收藏 人收藏

    評論

    相關推薦

    嵌入式中零長度數組基本操作方法

    C語言零長度數組,聽起來可能有點奇怪,因為它沒有分配內存空間,無法存儲數據。但實際上,零長度數組在Linux內核中隨處可見。 零長度數組定義
    的頭像 發(fā)表于 05-11 08:49 ?801次閱讀
    嵌入式中<b class='flag-5'>零長度數組</b>基本操作方法

    在AN65974中短數據包零長數據包是什么意思?

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

    緩沖區(qū)數據如何轉換成數組

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

    請問串口DMA+環(huán)形緩沖區(qū)如何實現不定長度的數據收發(fā)?

    請問串口DMA+環(huán)形緩沖區(qū)如何實現不定長度的數據收發(fā)?
    發(fā)表于 12-08 06:13

    怎樣去使用STM32串口驅動不定長數據接收帶環(huán)形緩沖區(qū)

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

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

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

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

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

    日常編程中柔性數組定義和應用

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

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

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

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

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

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

    指針數據包 相信大多數人會將定長數組換為 指針 , 每次使用時動態(tài)的開辟 CURR_LENGTH 大小的空間, 因為這樣可以避免造成 MAX_LENGTH - CURR_LENGTH 空間的浪費
    的頭像 發(fā)表于 09-27 15:01 ?431次閱讀

    變長數據包數據結構定義

    用方便的呢? GNU C 的0長度數組(變長數組/柔性數組)就是這樣一個擴展. 對于 0數組 的這個特點,很容易構造出變成結構體,如
    的頭像 發(fā)表于 09-27 15:08 ?631次閱讀

    C++環(huán)形緩沖區(qū)設計與實現

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

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

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

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

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