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

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()函数解析相关推荐

  1. c: realloc()函数解析

    realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小. 如果将分配的内存减少,realloc仅仅是改变索引的 ...

  2. c语言中realloc()函数解析

    http://blog.csdn.net/hackerain/article/details/7954006 realloc(void *__ptr, size_t __size):更改已经配置的内存 ...

  3. 【C语言】realloc函数

    前言:在C/C++的学习过程当中一定一定要多刷题,牛客网作为国内内容超级丰富的IT题库,尤其是它的C.C++,有从入门到大厂真题,而且大部分的考试题目也是从中抽取,还有很多面经,推荐大家去牛客网进行刷 ...

  4. oracle rpad mysql_Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析

    SELECT TO_CHAR(SYSDATE,'YYMMDD')||LPAD(REFUNDSEQ.NEXTVAL,6,'0') AS RES_ORDER_NO FROM DUAL 该语句拼接 时间 与 ...

  5. json数据解析_VBA 实践指南 -- Split函数解析Json数据

    什么是JSON? JSON(JavaScript Object Notation) 是一种及其轻量级的数据交换格式,它是 ECMAScript (欧洲计算机协会制定的JavaScript规范)的一个子 ...

  6. C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...

  7. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

    C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 参考文章: (1)C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 (2)https://www.cnbl ...

  8. realloc函数引发的慘案

    帮别人调试个程序,程序的功能主要涉及动态数组.实现动态数组元素的加入,删除,查找.显示功能.可是在运行加入功能的时候,连续运行三次加入的时候就会出现故障,让人感到很的莫名其妙. 涉及到的函数例如以下所 ...

  9. realloc函数在使用上要注意什么问题

    realloc函数在使用上要注意什么问题 这个函数的作用是重新分配空间大小,返回的头指针不变,只是改变空间大小.既然是改变,就有变大.变小和为什么改变的问题.变大,要注意不能大到内存溢出:变小,那变小 ...

最新文章

  1. R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载、划分数据、并分别构建线性回归模型和广义线性加性模型GAMs、并比较线性模型和GAMs模型的性能
  2. pytorch移动端,官方helloworld不同模型仍旧好用
  3. 一只青蛙跳向三个台阶_青蛙跳台阶
  4. Java程序员如何在5年内从小白晋升为高手?
  5. LeetCode-Search In Rotated Sorted Array2题解
  6. 计算智能-群智能算法-蚁群算法matlab实现
  7. 多么痛的领悟--写在领英股票被腰斩之后
  8. 每个工程师都应该了解的:聊聊幂等
  9. 腾讯视频app怎么允许腾讯视频访问位置信息
  10. C#调用VC DLL 复杂结构 解决方法
  11. 什么是 “动态规划” , 用两个经典问题举例。
  12. 隔离 docker 容器中的用户-------分享链接
  13. 【Python学习笔记】集合set
  14. 设置android模拟器的ip地址,设置Android模拟器IP地址
  15. [SSM]报错500:org.springframework.dao.DataIntegrityViolationException
  16. HTML+CSS淘宝首页[web课设代码+模块说明+效果图]
  17. 【计几】二维计算几何基础
  18. 服务器带外管理默认账号
  19. HTV-VIVE 连接 PC端 720云
  20. 十一道家常小菜详细攻略[图文并茂]

热门文章

  1. 细菌基因组 | rpoB的插入变异导致高度耐药性
  2. Nature重磅:发现延长女性生育寿命的新基因
  3. 文章用图的修改和排版 (一)
  4. 计算机类自主招生推荐信,自主招生推荐信范文:中国人民大学自主招生推荐信...
  5. Vue第一部分(4):表单的双向数据绑定:v-model指令
  6. request payload怎么发_做了一个个人博客,但不知道怎么介绍
  7. Java笔记-解决WebServiceTemplate中No subject alternative names matching IP address xxx
  8. Android逆向文档阅读笔记-Android Application Fundamentals
  9. C/C++,Qt,Python,OpenCV小项目实战-实时桌面颜色查询
  10. C++ STL list删除和修改