如何使用指针数据包定义数据缓冲区

描述

指针数据包

相信大多数人会将定长数组换为 指针 , 每次使用时动态的开辟 CURR_LENGTH 大小的空间, 因为这样可以避免造成 MAX_LENGTH - CURR_LENGTH 空间的浪费, 只浪费了一个指针域的空间.

  • 数据包定义
struct point_buffer
{
    int     len;
    char    *data;
};
  • 数据结构大小

考虑对齐, 那么数据结构的大小 >= sizeof(int) + sizeof(char *)

  • 数据包创建

但是在开辟内存时, 需要调用两次malloc ,第一次给结构体分配内存,第二次给成员data分配内存:

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);
        }
    }
  • 释放

释放也需要调用两次free函数 ,先释放数据域指针,再释放结构体指针:

/// 销毁
    free(pbuffer- >data);
    free(pbuffer);
    pbuffer = NULL;
  • 优点 :不会造成空间的大量浪费,只多使用了一个指针大小的空间
  • 缺点 :开辟空间时需要额外开辟数据域的空间,释放时也需要先释放数据域的空间。假如用户不知道这个数据包创建的具体细节,有可能会只释放结构体指针,不释放数据域指针。因此容易造成内存泄露。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分