精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

零長數組如何使用定長包定義數據緩沖區

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

零長數組

請先思考以下問題:

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

第一個問題

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

先對零長數組做個介紹:

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

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

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

第二個問題

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

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

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

定長包

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

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

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

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

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

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

  • 數據包創建

當接收到數據時,使用malloc動態分配內存。一般來說, 我們會返回一個指向緩沖區數據結構 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;
  • 優點 :使用簡單,內存的開辟和釋放簡單
  • 缺點 :使用定長數組作為數據緩沖區, 為了避免造成緩沖區溢出, 數組的大小一般設為足夠的空間 MAX_LENGTH, 而實際使用過程中, 達到 MAX_LENGTH 長度的數據很少, 那么多數情況下, 緩沖區的大部分空間都是浪費掉的.
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6909

    瀏覽量

    88849
  • C語言
    +關注

    關注

    180

    文章

    7601

    瀏覽量

    136251
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40095
  • 數組
    +關注

    關注

    1

    文章

    416

    瀏覽量

    25913
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    緩沖區數據如何轉換成數組

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

    請問串口DMA+環形緩沖區如何實現不定長度的數據收發?

    請問串口DMA+環形緩沖區如何實現不定長度的數據收發?
    發表于 12-08 06:13

    怎樣去使用STM32串口驅動不定長數據接收帶環形緩沖區

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

    環形緩沖區的實現原理

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

    緩沖區是啥意思 STM32串口數據接收之環形緩沖區

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

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

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

    STM32串口數據接收 --環形緩沖區

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

    環形緩沖區的實現思路

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

    如何使用指針數據包定義數據緩沖區

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

    變長數據包數據結構定義

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

    C++環形緩沖區設計與實現

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

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

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

    單片機中的幾種環形緩沖區的分析和實現

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