C/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);//不能再次释放,有博友说不需要释放:应该其实不需要自己释放number2return 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
C/C++ realloc()函数解析相关推荐
- c: realloc()函数解析
realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小. 如果将分配的内存减少,realloc仅仅是改变索引的 ...
- c语言中realloc()函数解析
http://blog.csdn.net/hackerain/article/details/7954006 realloc(void *__ptr, size_t __size):更改已经配置的内存 ...
- 【C语言】realloc函数
前言:在C/C++的学习过程当中一定一定要多刷题,牛客网作为国内内容超级丰富的IT题库,尤其是它的C.C++,有从入门到大厂真题,而且大部分的考试题目也是从中抽取,还有很多面经,推荐大家去牛客网进行刷 ...
- oracle rpad mysql_Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析
SELECT TO_CHAR(SYSDATE,'YYMMDD')||LPAD(REFUNDSEQ.NEXTVAL,6,'0') AS RES_ORDER_NO FROM DUAL 该语句拼接 时间 与 ...
- json数据解析_VBA 实践指南 -- Split函数解析Json数据
什么是JSON? JSON(JavaScript Object Notation) 是一种及其轻量级的数据交换格式,它是 ECMAScript (欧洲计算机协会制定的JavaScript规范)的一个子 ...
- C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别
2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...
- C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 参考文章: (1)C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 (2)https://www.cnbl ...
- realloc函数引发的慘案
帮别人调试个程序,程序的功能主要涉及动态数组.实现动态数组元素的加入,删除,查找.显示功能.可是在运行加入功能的时候,连续运行三次加入的时候就会出现故障,让人感到很的莫名其妙. 涉及到的函数例如以下所 ...
- realloc函数在使用上要注意什么问题
realloc函数在使用上要注意什么问题 这个函数的作用是重新分配空间大小,返回的头指针不变,只是改变空间大小.既然是改变,就有变大.变小和为什么改变的问题.变大,要注意不能大到内存溢出:变小,那变小 ...
最新文章
- R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载、划分数据、并分别构建线性回归模型和广义线性加性模型GAMs、并比较线性模型和GAMs模型的性能
- pytorch移动端,官方helloworld不同模型仍旧好用
- 一只青蛙跳向三个台阶_青蛙跳台阶
- Java程序员如何在5年内从小白晋升为高手?
- LeetCode-Search In Rotated Sorted Array2题解
- 计算智能-群智能算法-蚁群算法matlab实现
- 多么痛的领悟--写在领英股票被腰斩之后
- 每个工程师都应该了解的:聊聊幂等
- 腾讯视频app怎么允许腾讯视频访问位置信息
- C#调用VC DLL 复杂结构 解决方法
- 什么是 “动态规划” , 用两个经典问题举例。
- 隔离 docker 容器中的用户-------分享链接
- 【Python学习笔记】集合set
- 设置android模拟器的ip地址,设置Android模拟器IP地址
- [SSM]报错500:org.springframework.dao.DataIntegrityViolationException
- HTML+CSS淘宝首页[web课设代码+模块说明+效果图]
- 【计几】二维计算几何基础
- 服务器带外管理默认账号
- HTV-VIVE 连接 PC端 720云
- 十一道家常小菜详细攻略[图文并茂]
热门文章
- 细菌基因组 | rpoB的插入变异导致高度耐药性
- Nature重磅:发现延长女性生育寿命的新基因
- 文章用图的修改和排版 (一)
- 计算机类自主招生推荐信,自主招生推荐信范文:中国人民大学自主招生推荐信...
- Vue第一部分(4):表单的双向数据绑定:v-model指令
- request payload怎么发_做了一个个人博客,但不知道怎么介绍
- Java笔记-解决WebServiceTemplate中No subject alternative names matching IP address xxx
- Android逆向文档阅读笔记-Android Application Fundamentals
- C/C++,Qt,Python,OpenCV小项目实战-实时桌面颜色查询
- C++ STL list删除和修改