變長數(shù)據(jù)包
定長數(shù)組使用方便, 但是卻浪費空間, 指針形式只多使用了一個指針的空間, 不會造成大量空間分浪費, 但是使用起來需要多次分配, 多次釋放, 那么有沒有一種實現(xiàn)方式能夠既不浪費空間, 又使用方便的呢?
GNU C
的0長度數(shù)組(變長數(shù)組/柔性數(shù)組)就是這樣一個擴(kuò)展. 對于0長數(shù)組的這個特點,很容易構(gòu)造出變成結(jié)構(gòu)體,如緩沖區(qū),數(shù)據(jù)包等等:
- 數(shù)據(jù)結(jié)構(gòu)定義
// 0長度數(shù)組
struct zero_buffer
{
int len;
char data[0];
};
- 數(shù)據(jù)結(jié)構(gòu)大小
這樣的變長數(shù)組常用于網(wǎng)絡(luò)通信中構(gòu)造不定長數(shù)據(jù)包, 不會浪費空間浪費網(wǎng)絡(luò)流量, 因為char data[0];
只是個數(shù)組名, 是不占用存儲空間的,
即 sizeof(struct zero_buffer) = sizeof(int)
- 數(shù)據(jù)包創(chuàng)建
我們使用的時候, 只需要開辟一次空間即可:
/// 開辟
if ((zbuffer = (struct zero_buffer *)malloc(sizeof(struct zero_buffer) + sizeof(char) * CURR_LENGTH)) != NULL)
{
zbuffer- >len = CURR_LENGTH;
memcpy(zbuffer- >data, "Hello World", CURR_LENGTH);
printf("%d, %sn", zbuffer- >len, zbuffer- >data);
}
- 釋放
釋放也是一樣的, 一次釋放即可:
/// 銷毀
free(zbuffer);
zbuffer = NULL;
-
C語言
+關(guān)注
關(guān)注
180文章
7631瀏覽量
141358 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
269瀏覽量
24968 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40713
發(fā)布評論請先 登錄
不同數(shù)據(jù)結(jié)構(gòu)的定義代碼
什么是數(shù)據(jù)結(jié)構(gòu)(Data Structrue)
數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作
OBS邊緣節(jié)點中變長數(shù)據(jù)包突發(fā)匯聚實現(xiàn)
網(wǎng)絡(luò)數(shù)據(jù)包捕獲機(jī)制研究
基于Jpcap的數(shù)據(jù)包捕獲器的設(shè)計與實現(xiàn)
數(shù)據(jù)包過濾原理

什么是數(shù)據(jù)包?
數(shù)據(jù)結(jié)構(gòu)是什么_數(shù)據(jù)結(jié)構(gòu)有什么用

什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實例分析

網(wǎng)絡(luò)數(shù)據(jù)包分析軟件wireshark的基本使用
NetApp的數(shù)據(jù)結(jié)構(gòu)是如何演變的

評論