= sizeof(int) + sizeof(char *) 數據包創建 但是在開辟內存時, 需要調用兩次malloc ,第一次給結構體分配內存,第二次給成員data分配內存: if ((pbuffer = (struct point_buffer *) malloc ( sizeof (stru" />

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

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

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

3天內不再提示

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

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

指針數據包

相信大多數人會將定長數組換為 指針 , 每次使用時動態的開辟 CURR_LENGTH 大小的空間, 因為這樣可以避免造成 MAX_LENGTH - CURR_LENGTH 空間的浪費, 只浪費了一個指針域的空間.

  • 數據包定義
struct point_buffer
{
    int     len;
    char    *data;
};
  • 數據結構大小

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

  • 數據包創建

但是在開辟內存時, 需要調用兩次malloc ,第一次給結構體分配內存,第二次給成員data分配內存:

if ((pbuffer = (struct point_buffer *)malloc(sizeof(struct point_buffer))) != NULL)
    {
        pbuffer- >len = CURR_LENGTH;
        if ((pbuffer- >data = (char *)malloc(sizeof(char) * CURR_LENGTH)) != NULL)
        {
            memcpy(pbuffer- >data, "Hello World", CURR_LENGTH);


            printf("%d, %sn", pbuffer- >len, pbuffer- >data);
        }
    }
  • 釋放

釋放也需要調用兩次free函數 ,先釋放數據域指針,再釋放結構體指針:

/// 銷毀
    free(pbuffer- >data);
    free(pbuffer);
    pbuffer = NULL;
  • 優點 :不會造成空間的大量浪費,只多使用了一個指針大小的空間
  • 缺點 :開辟空間時需要額外開辟數據域的空間,釋放時也需要先釋放數據域的空間。假如用戶不知道這個數據包創建的具體細節,有可能會只釋放結構體指針,不釋放數據域指針。因此容易造成內存泄露。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7601

    瀏覽量

    136235
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70512
  • 數據包
    +關注

    關注

    0

    文章

    253

    瀏覽量

    24366
收藏 人收藏

    評論

    相關推薦

    使用UART FIFO緩沖區時,緩沖區中的數據有時會損壞的原因?

    我在使用 UART FIFO 緩沖區時遇到了以下問題。 問題描述: 當通過兩個 UART 通道使用完整的 UART FIFO 緩沖區并通過兩個通道進行通信時,緩沖區中的數據有時會損壞,
    發表于 03-06 06:59

    ESP8266有雙緩沖區嗎?

    我想實時傳輸一些信號的測量數據。信號的采樣周期為 1 ms。我想每 500 毫秒發送 2048 字節(一個數據包)。ESP8266有雙緩沖區(2x 2048字節)嗎?其想法是計數填充一個緩沖區
    發表于 07-16 07:29

    STM32串口環形緩沖區的實現

    一個數組,只不過有兩個指針,一個指向列隊頭,一個指向列隊尾。指向列隊頭的指針(Head)是緩沖區可讀的數據,指向列隊尾的指針(Tail)是
    發表于 10-16 11:40

    基于ARM和FPGA的環形緩沖區接口設計方案

    公司的V5系列SX95T型FPGA組成。物理層最高速率為1Mb/s,通過變化來自應用層的數據包大小和的間隔來改變用戶速率,用以測試ARM和FPGA的數據緩沖區和匹配功能。實際測試和運行表明,此方案
    發表于 05-30 05:00

    如何檢測數據包丟失?

    您好,我想做一個回環字體(發送一個IP地址和MAC地址反轉的rx),具有最好的性能(這是對網絡段進行速度測試)。我可以將rx緩沖區切換到tx緩沖區(以避免復制)嗎?你能給我一個源代
    發表于 03-13 08:56

    一文讀懂路由器緩沖區大小的重要性

    對于網絡而言,數據包在網線上的時候,絕對安全,絕對是全速前進,最危險的就是到達轉發設備內部,設備處理數據包帶來的固有延遲導致數據包必須有機會被緩沖,處理加速比一定要和
    發表于 10-15 09:47 ?4586次閱讀

    CPU與GPU維護數據結構來保證環形緩沖區的正確工作

    CPU 和 GPU 將各自維護一些數據結構來保證環形緩沖區的正確工作。這些 數據結構有緩沖區的基地址,緩沖區大小,寫
    的頭像 發表于 03-30 15:01 ?6428次閱讀
    CPU與GPU維護<b class='flag-5'>數據</b>結構來保證環形<b class='flag-5'>緩沖區</b>的正確工作

    環形緩沖區的實現原理

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

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

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

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

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

    數據包的發送流程

    一個數據包,從聊天框里發出,消息會從聊天軟件所在的用戶空間拷貝到內核空間的發送緩沖區(send buffer),數據包就這樣順著傳輸層、網絡層,進入到數據鏈路層,在這里
    的頭像 發表于 08-19 14:38 ?2616次閱讀

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

    零長數組 請先思考以下問題: C語言中,數組長度是否可以為0? 如果要接收一個不定長數據包,你會如何定義數據緩沖區? 第一個問題 : 在標準C語言中,沒有長度為0的數組,但在 GNU
    的頭像 發表于 09-27 14:58 ?649次閱讀

    變長數據包數據結構定義

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

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

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

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

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