零長(zhǎng)數(shù)組
請(qǐng)先思考以下問(wèn)題:
- C語(yǔ)言中,數(shù)組長(zhǎng)度是否可以為0?
- 如果要接收一個(gè)不定長(zhǎng)數(shù)據(jù)包,你會(huì)如何定義數(shù)據(jù)緩沖區(qū)?
第一個(gè)問(wèn)題 :
在標(biāo)準(zhǔn)C語(yǔ)言中,沒(méi)有長(zhǎng)度為0的數(shù)組,但在 GNU C語(yǔ)言中,數(shù)組長(zhǎng)度可以為0 ,這是GNU對(duì)C語(yǔ)言的擴(kuò)展。
先對(duì)零長(zhǎng)數(shù)組做個(gè)介紹:
零長(zhǎng)數(shù)組 :也叫柔性數(shù)組(變長(zhǎng)數(shù)組) :
- 用途 : 長(zhǎng)度為0的數(shù)組的主要用途是為了滿足需要變長(zhǎng)度的結(jié)構(gòu)體
- 用法 : 在一個(gè)結(jié)構(gòu)體的最后, 申明一個(gè)長(zhǎng)度為0的數(shù)組, 就可以使得這個(gè) 結(jié)構(gòu)體是可變長(zhǎng)的 。
對(duì)于編譯器來(lái)說(shuō), 此時(shí) 長(zhǎng)度為0的數(shù)組并不占用空間 , 因?yàn)閿?shù)組名本身不占空間, 它只是一個(gè)偏移量, 數(shù)組名這個(gè)符號(hào)本身代表了一個(gè)不可修改的 地址常量 。
第二個(gè)問(wèn)題 :
通常定義一個(gè)不定長(zhǎng)數(shù)據(jù)包的緩沖區(qū),有兩種常用方法:
- 定長(zhǎng)數(shù)據(jù)緩沖區(qū) , 設(shè)置一個(gè)足夠大小
MAX_LENGTH
的數(shù)據(jù)緩沖區(qū) - 設(shè)置一個(gè)指向?qū)嶋H數(shù)據(jù)的指針 , 每次使用時(shí), 按照數(shù)據(jù)的長(zhǎng)度動(dòng)態(tài)的開辟數(shù)據(jù)緩沖區(qū)的空間
下面依次分析使用 定長(zhǎng)包 、指針數(shù)據(jù)包和使用零長(zhǎng)數(shù)組三種方式的不同。
定長(zhǎng)包
假設(shè)我們要在網(wǎng)絡(luò)中接收一個(gè)長(zhǎng)度為1024
字節(jié)的數(shù)據(jù),怎么定義數(shù)據(jù)緩沖區(qū)呢?
定義一個(gè)數(shù)據(jù)緩沖區(qū)結(jié)構(gòu)體data_buf
,成員包含數(shù)據(jù)長(zhǎng)度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ù)最大長(zhǎng)度限制為MAX_LENGTH
字節(jié),以滿足接收數(shù)據(jù)的需求。
考慮對(duì)齊, 那么數(shù)據(jù)結(jié)構(gòu)的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH
但是,通常情況下,我們接收的數(shù)據(jù)不會(huì)達(dá)到最大長(zhǎng)度,假設(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)存。一般來(lái)說(shuō), 我們會(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ù)長(zhǎng)度
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) :使用定長(zhǎng)數(shù)組作為數(shù)據(jù)緩沖區(qū), 為了避免造成緩沖區(qū)溢出, 數(shù)組的大小一般設(shè)為足夠的空間
MAX_LENGTH
, 而實(shí)際使用過(guò)程中, 達(dá)到MAX_LENGTH
長(zhǎng)度的數(shù)據(jù)很少, 那么多數(shù)情況下, 緩沖區(qū)的大部分空間都是浪費(fèi)掉的.
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6722瀏覽量
88331 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7575瀏覽量
134360 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
569瀏覽量
40031 -
數(shù)組
+關(guān)注
關(guān)注
1文章
411瀏覽量
25835
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論