零長數(shù)組
請先思考以下問題:
- C語言中,數(shù)組長度是否可以為0?
- 如果要接收一個(gè)不定長數(shù)據(jù)包,你會如何定義數(shù)據(jù)緩沖區(qū)?
第一個(gè)問題 :
在標(biāo)準(zhǔn)C語言中,沒有長度為0的數(shù)組,但在 GNU C語言中,數(shù)組長度可以為0 ,這是GNU對C語言的擴(kuò)展。
先對零長數(shù)組做個(gè)介紹:
零長數(shù)組 :也叫柔性數(shù)組(變長數(shù)組) :
- 用途 : 長度為0的數(shù)組的主要用途是為了滿足需要變長度的結(jié)構(gòu)體
- 用法 : 在一個(gè)結(jié)構(gòu)體的最后, 申明一個(gè)長度為0的數(shù)組, 就可以使得這個(gè) 結(jié)構(gòu)體是可變長的 。
對于編譯器來說, 此時(shí) 長度為0的數(shù)組并不占用空間 , 因?yàn)閿?shù)組名本身不占空間, 它只是一個(gè)偏移量, 數(shù)組名這個(gè)符號本身代表了一個(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ù)的需求。
考慮對齊, 那么數(shù)據(jù)結(jié)構(gòu)的大小 >= sizeof(int) + sizeof(char) * MAX_LENGTH
但是,通常情況下,我們接收的數(shù)據(jù)不會達(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)存。一般來說, 我們會返回一個(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) :使用簡單,內(nèi)存的開辟和釋放簡單
- 缺點(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文章
7139瀏覽量
89568 -
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137702 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40230 -
數(shù)組
+關(guān)注
關(guān)注
1文章
417瀏覽量
26027
發(fā)布評論請先 登錄
相關(guān)推薦
嵌入式中零長度數(shù)組基本操作方法
![嵌入式中<b class='flag-5'>零長度數(shù)組</b>基本操作方法](https://file1.elecfans.com//web2/M00/E5/26/wKgaomY_FmCASuqKAACr-GPuQ2c182.png)
在AN65974中短數(shù)據(jù)包和零長數(shù)據(jù)包是什么意思?
緩沖區(qū)中數(shù)據(jù)如何轉(zhuǎn)換成數(shù)組
請問串口DMA+環(huán)形緩沖區(qū)如何實(shí)現(xiàn)不定長度的數(shù)據(jù)收發(fā)?
怎樣去使用STM32串口驅(qū)動(dòng)不定長數(shù)據(jù)接收帶環(huán)形緩沖區(qū)呢
環(huán)形緩沖區(qū)的實(shí)現(xiàn)原理
![環(huán)形<b class='flag-5'>緩沖區(qū)</b>的實(shí)現(xiàn)原理](https://file.elecfans.com/web1/M00/B8/82/pIYBAF5y0neAdrPjAAB_tdZgU0Y609.png)
緩沖區(qū)是啥意思 STM32串口數(shù)據(jù)接收之環(huán)形緩沖區(qū)
日常編程中柔性數(shù)組的定義和應(yīng)用
STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)
![STM32串口<b class='flag-5'>數(shù)據(jù)</b>接收 --環(huán)形<b class='flag-5'>緩沖區(qū)</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
環(huán)形緩沖區(qū)的實(shí)現(xiàn)思路
如何使用指針數(shù)據(jù)包定義數(shù)據(jù)緩沖區(qū)
變長數(shù)據(jù)包數(shù)據(jù)結(jié)構(gòu)定義
C++環(huán)形緩沖區(qū)設(shè)計(jì)與實(shí)現(xiàn)
![C++環(huán)形<b class='flag-5'>緩沖區(qū)</b>設(shè)計(jì)與實(shí)現(xiàn)](https://file1.elecfans.com/web2/M00/AE/FD/wKgZomVMUCmAf_A4AAB1sbO2qKI881.jpg)
交換機(jī)與路由器緩沖區(qū):尋找完美大小
![交換機(jī)與路由器<b class='flag-5'>緩沖區(qū)</b>:尋找完美大小](https://file1.elecfans.com//web2/M00/C8/DF/wKgaomYXpbmAMT38AAFgU0Z39Tk743.png)
單片機(jī)中的幾種環(huán)形緩沖區(qū)的分析和實(shí)現(xiàn)
![單片機(jī)中的幾種環(huán)形<b class='flag-5'>緩沖區(qū)</b>的分析和實(shí)現(xiàn)](https://file1.elecfans.com/web2/M00/02/F1/wKgaoma5syyAYzztAAA5LSZZo34694.png)
評論