零長數(shù)組
請(qǐng)先思考以下問題:
- C語言中,數(shù)組長度是否可以為0?
- 如果要接收一個(gè)不定長數(shù)據(jù)包,你會(huì)如何定義數(shù)據(jù)緩沖區(qū)?
第一個(gè)問題 :
在標(biāo)準(zhǔn)C語言中,沒有長度為0的數(shù)組,但在 GNU C語言中,數(shù)組長度可以為0 ,這是GNU對(duì)C語言的擴(kuò)展。
先對(duì)零長數(shù)組做個(gè)介紹:
零長數(shù)組 :也叫柔性數(shù)組(變長數(shù)組) :
- 用途 : 長度為0的數(shù)組的主要用途是為了滿足需要變長度的結(jié)構(gòu)體
- 用法 : 在一個(gè)結(jié)構(gòu)體的最后, 申明一個(gè)長度為0的數(shù)組, 就可以使得這個(gè) 結(jié)構(gòu)體是可變長的 。
對(duì)于編譯器來說, 此時(shí) 長度為0的數(shù)組并不占用空間 , 因?yàn)閿?shù)組名本身不占空間, 它只是一個(gè)偏移量, 數(shù)組名這個(gè)符號(hào)本身代表了一個(gè)不可修改的 地址常量 。
第二個(gè)問題 :
通常定義一個(gè)不定長數(shù)據(jù)包的緩沖區(qū),有兩種常用方法:
- 定長數(shù)據(jù)緩沖區(qū) , 設(shè)置一個(gè)足夠大小
MAX_LENGTH
的數(shù)據(jù)緩沖區(qū) - 設(shè)置一個(gè)指向?qū)嶋H數(shù)據(jù)的指針 , 每次使用時(shí), 按照數(shù)據(jù)的長度動(dòng)態(tài)的開辟數(shù)據(jù)緩沖區(qū)的空間
下面依次分析使用 定長包 、指針數(shù)據(jù)包和使用零長數(shù)組三種方式的不同。
定長包
假設(shè)我們要在網(wǎng)絡(luò)中接收一個(gè)長度為1024
字節(jié)的數(shù)據(jù),怎么定義數(shù)據(jù)緩沖區(qū)呢?
定義一個(gè)數(shù)據(jù)緩沖區(qū)結(jié)構(gòu)體data_buf
,成員包含數(shù)據(jù)長度len
和數(shù)據(jù)內(nèi)容data
:
- 數(shù)據(jù)結(jié)構(gòu)定義 :
struct data_buf{
int len;
char data[MAX_LENGTH];
}
- 數(shù)據(jù)結(jié)構(gòu)大小 :
數(shù)據(jù)內(nèi)容放在data
數(shù)組中,數(shù)據(jù)最大長度限制為MAX_LENGTH
字節(jié),以滿足接收數(shù)據(jù)的需求。
考慮對(duì)齊, 那么數(shù)據(jù)結(jié)構(gòu)的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH
但是,通常情況下,我們接收的數(shù)據(jù)不會(huì)達(dá)到最大長度,假設(shè)MAX_LENGTH
=2048
,那么接收1024字節(jié)內(nèi)容,還有1024字節(jié)空間就浪費(fèi)了。
- 數(shù)據(jù)包創(chuàng)建 :
當(dāng)接收到數(shù)據(jù)時(shí),使用malloc動(dòng)態(tài)分配內(nèi)存。一般來說, 我們會(huì)返回一個(gè)指向緩沖區(qū)數(shù)據(jù)結(jié)構(gòu) data_buf
的指針:
/// 開辟
if ((mbuffer = (struct data_buf *)malloc(sizeof(struct data_buf))) != NULL)
{
mbuffer- >len = CURR_LENGTH;//CURR_LENGTH為接收到的數(shù)據(jù)長度
memcpy(mbuffer- >data, "Hello World", CURR_LENGTH);
printf("%d, %sn", mbuffer- >len, mbuffer- >data);
}
- 釋放 :
/// 銷毀
free(mbuffer);
mbuffer = NULL;
- 優(yōu)點(diǎn) :使用簡(jiǎn)單,內(nèi)存的開辟和釋放簡(jiǎn)單
- 缺點(diǎn) :使用定長數(shù)組作為數(shù)據(jù)緩沖區(qū), 為了避免造成緩沖區(qū)溢出, 數(shù)組的大小一般設(shè)為足夠的空間
MAX_LENGTH
, 而實(shí)際使用過程中, 達(dá)到MAX_LENGTH
長度的數(shù)據(jù)很少, 那么多數(shù)情況下, 緩沖區(qū)的大部分空間都是浪費(fèi)掉的.
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7002瀏覽量
88938 -
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136680 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40121 -
數(shù)組
+關(guān)注
關(guān)注
1文章
417瀏覽量
25939
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論