realloc的用法

简介: realloc的用法


一,我们来认识一下realloc函数、

void* realloc(void* ptr, size_t size)

  上面这个是realloc的函数原型,从中可以知道:

  1. void* pty : 这个是需要扩容的指针。
  2. size_t size : 重新分配的空间(单位为字节) 。
  3. 分配成功,返回void*指针(指向重新分配的字节数为size的内存块地址)
  4. 分配失败,返回NULL值。

二,realloc函数如何使用

1. 原地扩容 :

  这种情况出现在与原来指针指向的地址块后面的地址没有被分配,尚且空闲,于是realloc就直接在原来地址块后面直接扩容,分配新的空间。如下图:

2.异地扩容 :

  当原来指针指向的地址块后面的地址已经被分配,或者后面空闲地址的大小不够时,会在重新开辟新的地址,将原来地址块中的数据复制到新的地址中,然后会自动释放原来的地址空间。

如下图:

3.我们用代码示例出来:

//尾插法
void SLPushBack(SL* ps, SLDataType x) {
  //实现动态数组,容量就得实时监视,容量不够时扩容。
  if (ps->size == ps->capacity) {
    // 首先对容量进行判断,如果容量=0,那就初始化为4,否则就扩容为原来的二倍。
    int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    //void *realloc(void *ptr, size_t size); size_t size  : 重新分配的空间(单位为字节) ,pty : 需要扩容的指针。
    SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity*sizeof(SLDataType)); 
    
    //分配成功返回重新分配的字节数为size的内存块地址
    // 分配失败返回 NULL。
    if (tmp == NULL) {
      printf("realloc fail \n");
      exit(-1);
    }
  }
  ps->a[ps->size] = x; // x 是要插入的数据 。
  ps->size++; // size就是数据的数量,所以跟随尾插的次数而变化。
}

这是用C语言写的对顺序表的尾插法,代码中有解释,在这里不做过多阐述。

4.关于缩容

  realloc(ps -> a, 0);//将内存大小置为0,同时自动释放原来的内存。也就是realloc(ps -> a, 0)等效于free(ps)

  新人创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看。

相关文章
|
18天前
|
人工智能 JSON Java
【SpringAIAlibaba新手村系列】(7)结构化输出与对象映射
本文详解 Spring AI 结构化输出功能,通过 Java Record 与 .entity() 方法,实现 AI 的 JSON 响应自动映射为 Java 对象,解决纯文本难以集成的问题。文中还对比了 Lambda 写法并提供 Prompt 设计最佳实践。
160 3
|
27天前
|
缓存 NoSQL Java
高并发系统性能优化全链路实战:端到端榨干系统性能,百万 QPS 零卡顿
本文系统阐述高并发系统端到端全链路性能优化方法,涵盖接入层(HTTP/3、CDN、LVS)、网关层(Spring Cloud Gateway调优)、服务层(JDK21虚拟线程、线程池、Undertow、Protobuf)、缓存层(多级缓存、Caffeine、Redis)、数据库(索引/SQL/事务/连接池)及OS硬件层优化,并强调压测定位、避坑指南与闭环迭代。
425 3
|
5月前
|
SQL Oracle 关系型数据库
Oracle 数据库数据操作:精通 INSERT, UPDATE, DELETE
在Oracle里,增加数据用INSERT,修改用UPDATE,删除则用DELETE。进行修改和删除时,建议总是带上WHERE条件来指定范围,这样可以确保操作的准确性
1168 4
|
Shell Linux Ubuntu
解决在SecurecCRT登录后,发现方向键、backspace(退格键)、delete(删除键)为乱码的问题
问题:使用securecrt ssh到linux之后,backspace(退格键),delete(删除键),以及4个方向键都为乱码,不能正常使用。按tab键也没有自动补全文件名。 即: 按Backspace(退格键)和delete(删除键)屏幕显示的是:^H 按方向键则屏幕显示的是:^[[A^[[B^[[C^[[D 环境: SecureCRT8.
4739 0
|
算法 安全 编译器
C++优势
C++优势
469 29
|
测试技术 持续交付 项目管理
hatch,现代化的 Python 项目管理和打包工具!
hatch,现代化的 Python 项目管理和打包工具!
514 2
|
C语言
|
Java 测试技术 开发者
提高代码质量:深入实践测试驱动开发(TDD)
【8月更文挑战第14天】测试驱动开发是一种强大的软件开发方法,它通过先写测试再编写代码的方式,显著提高了代码质量。通过实践TDD,开发者可以编写出更可靠、更易于维护的代码,并加速开发进程。虽然TDD需要一定的学习和适应过程,但其带来的长期收益是不可估量的。如果你还没有尝试过TDD,现在就开始吧!
|
Linux API 图形学
OpenGL生态中的GL, GLU, GLUT, GLX, GLEW, GLEE和GLEXT详解
该文介绍了OpenGL生态系统中的关键组件,包括GL(基础绘图API)、GLU(提供辅助函数)、GLUT(窗口管理和事件处理)、GLX(X Window系统上的OpenGL扩展)、GLEW和GLEE(动态查询和封装OpenGL扩展)以及GLEXT(OpenGL扩展集合)。这些库和工具协同工作,帮助开发者构建跨平台的图形应用程序,提升兼容性与功能。理解它们的作用对优化OpenGL编程至关重要。
|
编译器 C语言
C语言——动态内存函数(malloc、calloc、realloc、free)
C语言——动态内存函数(malloc、calloc、realloc、free)

热门文章

最新文章

下一篇
开通oss服务