零長數組
請先思考以下問題:
- 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文章
7332瀏覽量
94557 -
C語言
+關注
關注
183文章
7643瀏覽量
145372 -
數據結構
+關注
關注
3文章
573瀏覽量
41528 -
數組
+關注
關注
1文章
420瀏覽量
27277
發布評論請先 登錄
相關推薦
熱點推薦
緩沖區中數據如何轉換成數組
各位高手,請問下我從儀器中讀取出來數據到緩沖區后,如何能把這些數據轉換成一個數組,格式應該怎樣去轉換。。。。半天也弄不出來 幫幫忙吧先謝謝大家了。。。
發表于 02-22 17:05
STM32串口數據接收 --環形緩沖區
STM32串口數據接收 --環形緩沖區環形緩沖區簡介??在單片機中串口通信是我們使用最頻繁的,使用串口通信就會用到串口的數據接收與發送,環形緩沖區
發表于 12-28 19:24
?31次下載
環形緩沖區的實現思路
單片機程序開發一般都會用到UART串口通信,通過通信來實現上位機和單片機程序的數據交互。通信中為了實現正常的收發,一般都會有對應的發送和接收緩存來暫存通信數據。這里使用環形緩沖區的方式來設計數
如何使用指針數據包定義數據緩沖區
指針數據包 相信大多數人會將定長數組換為 指針 , 每次使用時動態的開辟 CURR_LENGTH 大小的空間, 因為這樣可以避免造成 MAX_LENGTH - CURR_LENGTH 空間的浪費
變長數據包數據結構定義
用方便的呢? GNU C 的0長度數組(變長數組/柔性數組)就是這樣一個擴展. 對于 0長數組 的這個特點,很容易構造出變成結構體,如
C++環形緩沖區設計與實現
一、環形緩沖區基礎理論解析(Basic Theory of Circular Buffer) 1.1 環形緩沖區的定義與作用(Definition and Function of Circular
單片機中的幾種環形緩沖區的分析和實現
單片機中的幾種環形緩沖區的分析和實現一、簡介環形緩沖區(RingBuffer)是一種高效的使用內存的方法,它將一段固定長度的內存看成一個環形結構,用于存儲數據,能夠避免使用動態申請內存
零長數組如何使用定長包定義數據緩沖區
評論