指針數(shù)據(jù)包
相信大多數(shù)人會將定長數(shù)組換為 指針 , 每次使用時動態(tài)的開辟 CURR_LENGTH
大小的空間, 因為這樣可以避免造成 MAX_LENGTH - CURR_LENGTH
空間的浪費, 只浪費了一個指針域的空間.
- 數(shù)據(jù)包定義
struct point_buffer
{
int len;
char *data;
};
- 數(shù)據(jù)結(jié)構(gòu)大小
考慮對齊, 那么數(shù)據(jù)結(jié)構(gòu)的大小 >= sizeof(int) + sizeof(char *)
- 數(shù)據(jù)包創(chuàng)建
但是在開辟內(nèi)存時, 需要調(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)點 :不會造成空間的大量浪費,只多使用了一個指針大小的空間
- 缺點 :開辟空間時需要額外開辟數(shù)據(jù)域的空間,釋放時也需要先釋放數(shù)據(jù)域的空間。假如用戶不知道這個數(shù)據(jù)包創(chuàng)建的具體細(xì)節(jié),有可能會只釋放結(jié)構(gòu)體指針,不釋放數(shù)據(jù)域指針。因此容易造成內(nèi)存泄露。
-
C語言
+關(guān)注
關(guān)注
180文章
7630瀏覽量
140722 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71073 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
269瀏覽量
24919
發(fā)布評論請先 登錄
使用UART FIFO緩沖區(qū)時,緩沖區(qū)中的數(shù)據(jù)有時會損壞的原因?
ESP8266有雙緩沖區(qū)嗎?
基于ARM和FPGA的環(huán)形緩沖區(qū)接口設(shè)計方案
如何檢測數(shù)據(jù)包丟失?
一文讀懂路由器緩沖區(qū)大小的重要性
CPU與GPU維護數(shù)據(jù)結(jié)構(gòu)來保證環(huán)形緩沖區(qū)的正確工作

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

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

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

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

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

評論