首页 > 编程语言 >[C/C++] 结构体

[C/C++] 结构体

时间:2023-06-10 23:22:07浏览次数:36  
标签:buffer max LEN ptr1 C++ data ptr 结构

在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。

固定缓冲区

#define MAX_LEN 100
#define DATA_LEN 100

typedef struct {
    int length;
    char data[MAX_LEN]; // 固定缓冲区大小,浪费内存
} max_buffer, *max_buffer_ptr;

void base() {
    max_buffer_ptr m_buffer_ptr;
    if ((m_buffer_ptr = (max_buffer_ptr) malloc(sizeof(max_buffer))) != NULL) {
        m_buffer_ptr->length = DATA_LEN;  // 例如实际业务数据缓冲区大小为50
        memcpy(m_buffer_ptr->data, "hello_world", DATA_LEN);
        printf("%s %lu\n", m_buffer_ptr->data, sizeof(m_buffer_ptr->data));
    }
    free(m_buffer_ptr);
}

指针缓冲区

#define MAX_LEN 100
#define DATA_LEN 100

typedef struct {
    int length;
    char *data; // 节约内存,但是结构体和data两次分配的内存是不连续的, 需要分别对其进行管理(申请/释放内存),容易导致遗忘释放内存造成内存泄露
} max_buffer1, *max_buffer_ptr1;

void base_ptr() {
    max_buffer_ptr1 m_buffer_ptr1;
    if ((m_buffer_ptr1 = (max_buffer_ptr1) malloc(sizeof(max_buffer1))) != NULL) {
        m_buffer_ptr1->length = DATA_LEN;
        if ((m_buffer_ptr1->data = (char *) malloc(sizeof(char) * DATA_LEN)) != NULL) {
            memcpy(m_buffer_ptr1->data, "hello_world", DATA_LEN);
            printf("%s %lu\n", m_buffer_ptr1->data, strlen(m_buffer_ptr1->data));
        }
    }
    free(m_buffer_ptr1->data);
    free(m_buffer_ptr1);
}

柔性数组缓冲区

#define MAX_LEN 100
#define DATA_LEN 100

typedef struct {
    int length;
    char data[]; // 柔性数组,地址连续,只需要一次 malloc/free;对结构体格式有要求,必要放在最后,不是唯一成员
} max_buffer2, *max_buffer_ptr2;

void base_soft_array() {
    max_buffer_ptr2 m_buffer_ptr2;
    if ((m_buffer_ptr2 = (max_buffer_ptr2) malloc(sizeof(max_buffer2) + sizeof(char) * DATA_LEN)) != NULL) {
        m_buffer_ptr2->length = DATA_LEN;  // 例如实际业务数据缓冲区大小为50
        memcpy(m_buffer_ptr2->data, "hello_world", DATA_LEN);
        printf("%s %lu\n", m_buffer_ptr2->data, sizeof(m_buffer_ptr->data));
    }
    free(m_buffer_ptr2);
}

标签:buffer,max,LEN,ptr1,C++,data,ptr,结构
From: https://www.cnblogs.com/ffopen/p/17472173.html

相关文章

  • 《C++》--C转C++基础1
    变量类型、关键字变量类型:shortintlongdoublefloatcharbool输出cout<<""<<endl;#include<iostream>#include<string>usingnamespacestd;intmain(){ charstr1[]="Hello"; stringstr2="World";//string创建字符串......
  • Redis数据结构:高频面试题及解析
    概述Redis是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。Redis支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能......
  • 《数据结构与算法》之队列与链表复习
    导言:我们在上一次学习了堆栈的数据结构以后,可以了解到它是受限制的操作,比如我们操作只能在栈顶,现在我们要学习的东西叫做队列,它也是受限制的一种数据结构,它的特点是队头只出数据,而队尾只入数据,它的结构就和它的名字,像我们平时排队一样先来的人肯定要先服务啊,所以它的英文叫做Fri......
  • Redis数据结构--SDS动态字符串
    Redis中保存的key是字符串,value往往是字符串或者字符串的集合,但是redis并没有直接使用c语言中的字符串原因在于:1.获取字符串长度需要通过运算2.非二进制安全3.不可修改SDSstructsdshdr{//记录buf数组中使用字节的数量//等于SDS所保存字符串的长度......
  • C++ 指针
    一、C++指针的算术运算递增一个指针我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。下面的程序递增变量指针,以便顺序访问数组中的每一个元素:实例#include<iostream>usingnamespacestd;constintMAX=3;intmain()......
  • 第十四届蓝桥杯大赛软件赛国赛 C/C++ 大学 A 组
    Preface蓝桥杯战俘闪总出列!逆天比赛早上9点要赶到六七公里外的其它学校,因此早上7点就起来了然后坐公交颠着颠着就到了成都工业学院的门口,还刚好看到了lyy佬,就一起溜去考场了到了考场看了一圈好多熟悉的面孔,应该都是集训队的学长啥的,但好多名字还是叫不出来然后好像8点半就能......
  • 大二下 | 计算机体系结构 · 期中试卷
    一共有两张图片:(任国林老师:听我说谢谢你......
  • 大二上 | 数据结构小测试卷
    一共有三张图片:......
  • 大二上 | 数据结构期中试卷
    这是2019级的数据结构期中试卷,老师是汪芸老师。当时考了66分,作业也经常得“F”,留下了深刻的印象……一共有两张图片:......
  • Redis数据结构:高频面试题及解析
    概述Redis是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。Redis支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性......