realloc() 用法详解

realloc() 用法详解原型 externvoid realloc void mem address unsignedintn 语法 指针名 数据类型 realloc 要改变内存大小的指针名 新的大小 新的大小若小于原来的大小 原数据的末尾可能丢失 被其他使用内存的数据覆盖等 头文件 include stdlib h 有些编译器需要 include malloc h 在 TC2 0 中可以使用 alloc h 头文件功能 先判断当前的指针是否 malloc h stdlib h

原型:extern void *realloc(void *mem_address, unsigned int newsize);

语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。

      //新的大小若小于原来的大小,原数据的末尾可能丢失(被其他使用内存的数据覆盖等)

头文件:#include

有些编译器需要#include

,在TC2.0中可以使用alloc.h头文件

功能:先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

返回值:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

注意:这里原始内存中的数据还是保持不变的。当内存不再使用时,应使用free()函数将内存块释放。

应用举例

举例1:

从这个例子可以看出realloc函数的功能。

#include 
  
    #include 
   
     #define N 10000 int main() { int i; int *pn=(int *)malloc(5*sizeof(int)); printf("%p\n",pn); for(i=0;i<5;i++) pn[i] = i+1; printf("%d\n",sizeof(int)); int *pnn=(int *)realloc(pn, N*sizeof(int)); printf("%p\n",pnn); for(i=0;i<5;i++) printf("%3d",pnn[i]); //for(i=0;i<5;i++) //printf("%3d",pn[i]); printf("\n"); //free(pn); free(pnn); return 0; } 
    
  
//N取值较小时,输出如下 0x12ee010 4 0x12ee010 1 2 3 4 5 //N取值较大时,例如 输出如下 0xef8010 4 0x7fba7062e010 1 2 3 4 5

详细说明及注意要点

内存分配情况

<1>如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。

这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。

<2>如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。

并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。

老块被放回堆上。

若realloc成功,指向原内存地址的指针就成了悬挂指针,即指针指向了一块没有分配给用户使用的内存,如果再用该指针进行操作就可能发生意想不到的问题。所以在应用realloc函数是应当格外注意这种情况。

返回情况

返回的是一个void类型的指针:调用成功。(这就要求在你需要的时候进行强制类型转换)

返回NULL:当需要扩展的大小(第二个参数)为0并且第一个参数不为NULL时。此时原内存变成“free(游离)”的了。

返回NULL:当没有足够的空间可供扩展的时候。此时,原内存空间的大小维持不变。

特殊情况

如果mem_address为NULL,则realloc()和malloc()类似。分配一个newsize的内存块,返回一个指向该内存块的指针。

如果newsize大小为0,那么释放mem_address指向的内存,并返回NULL。

如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回NULL。而原来的内存块保持不变。

realloc使用总结

1. realloc失败的时候,返回NULL

2. realloc失败的时候,原来的内存不改变,不会释放也不会移动,(所以使用的时候应该保留原指针,避免分配失败产生内存泄漏)

3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址

4. 如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行释放,例如对二维指针a,对a调用realloc时只会释放一维,使用时谨防内存泄露。

5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的

6.传递给realloc的指针可以为空,等同于malloc。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208326.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:51
下一篇 2026年3月19日 上午11:51


相关推荐

  • width:100vh有感而发「建议收藏」

    width:100vh有感而发「建议收藏」在看一个网页的代码是看到width:100vh 纳尼。。。这这我怎么没有见过,这是个什么属性,随之有看到min-height:calc(100vh+51px);这尼玛又是怎么用的….感叹入行已整整两年却…先介绍一下vh:相对于视窗的高度,那么vw:则是相对于视窗的高度“视区”所指为浏览器内部的可视区域大小,即window.innerWidth/window.inn

    2022年6月7日
    42
  • 南京字节跳动公司招聘_字节跳动入职期权有多少

    南京字节跳动公司招聘_字节跳动入职期权有多少1.前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper到底有啥用不?如果别人/面试官让你给他讲讲对于ZooKeeper的认识,你能回答到什么地步呢?拿我自己来说吧!我本人曾经使用Dubbo来做分布式项目的时候,使用了ZooKeeper作为注册中心。为了保证分布式系统能够同步访问某个资源,我还使用ZooKeeper做过分布式锁。另外,我在学习Kafka的时候,知道Kafka很多功能的实现依赖了ZooKeeper。前几天,总结项目经验的时候,

    2022年10月3日
    5
  • OpenClaw macOS Sequoia 完整配置:让 Mac 变成 24 小时 AI 工作站

    OpenClaw macOS Sequoia 完整配置:让 Mac 变成 24 小时 AI 工作站

    2026年3月13日
    3
  • 使用C#开发屏幕保护程序步骤建议收藏

    本文介绍使用C#制作屏幕保护的方法,这个屏幕保护就是仿效视窗系统自带的字幕屏保。屏幕保护程序的扩展名虽然是"scr",但其实是一个可执行的"exe"文件。但他

    2021年12月20日
    46
  • 2022 sblime3 激活码【最新永久激活】2022.03.01

    (2022 sblime3 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~4…

    2022年4月2日
    55
  • c语言解析xml文档

    c语言解析xml文档DOM=DocumentObjectModel,文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。换句话说,这是表示和处理一个HTML或XML文档的常用方法。有一点很重要,DOM的设计是以对象管理组织(OMG)的规约为基础的,因此可以用于任何编程语言。       Dom技术使得用户页面可以动态地变化,如可以动态地显示或隐藏一个元素,改变它们的属性,增

    2022年7月12日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号