当前位置: 首页 > news >正文

C语言中realloc函数解析

真是有点惭愧,这些内容本应该很早就掌握的,以前只是糊里糊涂的用,不知道在内存中具体是怎么回事,现在才弄清楚。

realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。

如果将分配的内存减少,realloc仅仅是改变索引的信息。

如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。

注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。
看一下示例代码

#include <stdio.h>
#include <stdlib.h>int main(int argc, char* argv[], char* envp[])
{int input;int n;int *numbers1;int *numbers2;numbers1=NULL;if((numbers2=(int *)malloc(5*sizeof(int)))==NULL)//为numbers2在堆中分配内存空间{printf("malloc memory unsuccessful");exit(1);}printf("numbers2 addr: %8X\n",(int)numbers2);for(n=0;n<5;n++) //初始化{*(numbers2+n)=n;//printf("numbers2's data: %d\n",*(numbers2+n));}printf("Enter new size: ");scanf("%d",&input);//重新分配内存空间,如果分配成功的话,就释放numbers2指针,//但是并没有将numbers2指针赋为NULL,也就是说释放掉的是系统分配的堆空间,//和该指针没有直接的关系,现在仍然可以用numbers2来访问这部分堆空间,但是//现在的堆空间已经不属于该进程的了。numbers1=(int *)realloc(numbers2,(input+5)*sizeof(int));if(numbers1==NULL){printf("Error (re)allocating memory");exit(1);}printf("numbers1 addr: %8X\n",(int)numbers1);/*for(n=0;n<5;n++) //输出从numbers2拷贝来的数据{printf("the numbers1's data copy from numbers2: %d\n",*(numbers1+n));}*/for(n=0;n<input;n++)//新数据初始化{*(numbers1+5+n)=n+5;//printf("numbers1' new data: %d\n",*(numbers1+5+n));}printf("\n");free(numbers1);//释放numbers1,此处不需要释放numbers1,因为在realloc()时已经释放numbers1=NULL;//free(numbers2);//不能再次释放return 0;
}

如果当前内存段后有足够的空间,realloc()返回原来的指针:

yugsuo@ubuntu:~/linux/memange$ gcc -g -o realloc realloc_example.c 
yugsuo@ubuntu:~/linux/memange$ ./realloc 
numbers2 addr:  8AFC008
Enter new size: 10
numbers1 addr:  8AFC008

如果当前内存段后没有足够的空间,realloc()返回一个新的内存段的指针:

yugsuo@ubuntu:~/linux/memange$ ./realloc 
numbers2 addr:  9505008
Enter new size: 1000000
numbers1 addr: B716F008

相关文章:

  • 使用Jenkins触发gitlab的webhook
  • C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点
  • 嵌入式项目电灯
  • 集合总结(Java)
  • 657. 机器人能否返回原点
  • 面试算法43:在完全二叉树中添加节点
  • 【Python机器学习】零基础掌握permutation_importance检验、检查
  • Dubbo 路由及负载均衡性能优化
  • [AutoSAR系列] 1.3 AutoSar 架构
  • 垃圾回收系统小程序
  • Linux—vmstat命令详解
  • JAVA实现智能停车场管理系统 开源
  • Zookeeper Watcher机制--数据变更通知
  • ResNet简单解释
  • 深度学习中的epoch, batch 和 iteration
  • Babel配置的不完全指南
  • CSS魔法堂:Absolute Positioning就这个样
  • Git 使用集
  • JavaScript学习总结——原型
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Js基础知识(四) - js运行原理与机制
  • MySQL主从复制读写分离及奇怪的问题
  • spring boot 整合mybatis 无法输出sql的问题
  • spring cloud gateway 源码解析(4)跨域问题处理
  • vue-cli3搭建项目
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 汉诺塔算法
  • 浏览器缓存机制分析
  • 实战|智能家居行业移动应用性能分析
  • 使用 @font-face
  • 想写好前端,先练好内功
  • 小程序 setData 学问多
  • 协程
  • 怎么将电脑中的声音录制成WAV格式
  • 通过调用文摘列表API获取文摘
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (02)vite环境变量配置
  • (13)Hive调优——动态分区导致的小文件问题
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (全注解开发)学习Spring-MVC的第三天
  • (十一)手动添加用户和文件的特殊权限
  • (算法二)滑动窗口
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET/C# 的字符串暂存池
  • .Net中间语言BeforeFieldInit
  • ??在JSP中,java和JavaScript如何交互?
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解