零長數組
請先思考以下問題:
- 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文章
7026瀏覽量
89026 -
C語言
+關注
關注
180文章
7604瀏覽量
136813 -
數據結構
+關注
關注
3文章
573瀏覽量
40130 -
數組
+關注
關注
1文章
417瀏覽量
25945
發布評論請先 登錄
相關推薦
評論