指針數(shù)據(jù)包
相信大多數(shù)人會(huì)將定長(zhǎng)數(shù)組換為 指針 , 每次使用時(shí)動(dòng)態(tài)的開(kāi)辟 CURR_LENGTH
大小的空間, 因?yàn)檫@樣可以避免造成 MAX_LENGTH - CURR_LENGTH
空間的浪費(fèi), 只浪費(fèi)了一個(gè)指針域的空間.
- 數(shù)據(jù)包定義
struct point_buffer
{
int len;
char *data;
};
- 數(shù)據(jù)結(jié)構(gòu)大小
考慮對(duì)齊, 那么數(shù)據(jù)結(jié)構(gòu)的大小 >= sizeof(int) + sizeof(char *)
- 數(shù)據(jù)包創(chuàng)建
但是在開(kāi)辟內(nèi)存時(shí), 需要調(diào)用兩次malloc ,第一次給結(jié)構(gòu)體分配內(nèi)存,第二次給成員data分配內(nèi)存:
if ((pbuffer = (struct point_buffer *)malloc(sizeof(struct point_buffer))) != NULL)
{
pbuffer- >len = CURR_LENGTH;
if ((pbuffer- >data = (char *)malloc(sizeof(char) * CURR_LENGTH)) != NULL)
{
memcpy(pbuffer- >data, "Hello World", CURR_LENGTH);
printf("%d, %sn", pbuffer- >len, pbuffer- >data);
}
}
- 釋放
釋放也需要調(diào)用兩次free函數(shù) ,先釋放數(shù)據(jù)域指針,再釋放結(jié)構(gòu)體指針:
/// 銷毀
free(pbuffer- >data);
free(pbuffer);
pbuffer = NULL;
- 優(yōu)點(diǎn) :不會(huì)造成空間的大量浪費(fèi),只多使用了一個(gè)指針大小的空間
- 缺點(diǎn) :開(kāi)辟空間時(shí)需要額外開(kāi)辟數(shù)據(jù)域的空間,釋放時(shí)也需要先釋放數(shù)據(jù)域的空間。假如用戶不知道這個(gè)數(shù)據(jù)包創(chuàng)建的具體細(xì)節(jié),有可能會(huì)只釋放結(jié)構(gòu)體指針,不釋放數(shù)據(jù)域指針。因此容易造成內(nèi)存泄露。
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141848 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71204 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
269瀏覽量
24999
發(fā)布評(píng)論請(qǐng)先 登錄
使用UART FIFO緩沖區(qū)時(shí),緩沖區(qū)中的數(shù)據(jù)有時(shí)會(huì)損壞的原因?
ESP8266有雙緩沖區(qū)嗎?
基于ARM和FPGA的環(huán)形緩沖區(qū)接口設(shè)計(jì)方案
如何檢測(cè)數(shù)據(jù)包丟失?
一文讀懂路由器緩沖區(qū)大小的重要性
CPU與GPU維護(hù)數(shù)據(jù)結(jié)構(gòu)來(lái)保證環(huán)形緩沖區(qū)的正確工作

環(huán)形緩沖區(qū)的實(shí)現(xiàn)原理

緩沖區(qū)是啥意思 STM32串口數(shù)據(jù)接收之環(huán)形緩沖區(qū)
STM32串口數(shù)據(jù)接收 --環(huán)形緩沖區(qū)

數(shù)據(jù)包的發(fā)送流程
零長(zhǎng)數(shù)組如何使用定長(zhǎng)包定義數(shù)據(jù)緩沖區(qū)
變長(zhǎng)數(shù)據(jù)包數(shù)據(jù)結(jié)構(gòu)定義
C++環(huán)形緩沖區(qū)設(shè)計(jì)與實(shí)現(xiàn)

交換機(jī)與路由器緩沖區(qū):尋找完美大小

RTOS的流緩沖區(qū)機(jī)制解析

評(píng)論