专栏首页编程语言xuetangC语言进阶内置函数补充
原创

C语言进阶内置函数补充

原型:

用法:#include 有些编译器需要#include

功能:改变mem_address所指内存区域的大小为newsize长度。

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

当内存不再使用时,应使用free()函数将内存块释放。

注意:这里原始内存中的数据还是保持不变的。

详细说明及注意要点

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

2、如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。 并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。 例如:

3、返回情况

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

返回NULL,当需要扩展的大小(第二个参数)为0并且第一个参数不为NULL,此时原内存变成了“freed(游离)”的了。 返回NULL,当没有足够的空间可供扩展的时候,此时,原内存空间的大小维持不变。

4、特殊情况

如果mem_address为null,则realloc()和malloc()类似。分配一个newsize的内存块,返回一个指向该内存块的指针。 如果newsize大小为0,那么释放mem_address指向的内存,并返回null。 如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回null.而原来的内存块保持不变。

函数补充

都在stdlib.h函数库内,是C语言的标准内存分配函数。

1.函数malloc()和calloc().

2.主要区别.

3.函数realloc

realloc可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。

4.使用函数realloc注意事项

realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。所以在代码中,我们必须将realloc返回的值,重新赋值给 p :

p = (int *) realloc (p, sizeof(int) *15);接着我们再就关于realloc函数说明进行补充:

函数定义:

上面的分析基本没有问题,但有两点要注意:

1.返回值可能与ptr的值不同,如果是不同的话,那么realloc函数完成后,ptr指向的旧内存已被free(释放)掉了。2.如果返回NULL值,则分配不成功,而原来的ptr指向的内存还没有被free掉,要求程序显式free。故:

语句有这么一个问题,调用前p指向一个已分配成功的内存,而调用realloc时却失败(即返回NULL),此时,p原来指向的内存还没有free(释放)掉,而现在又找不到地址,这样就出现memory leak(即内存泄漏)了。

关于这一点的确要注意,最好如下:

更多干货笔记关注微信公众号 : 老九学堂

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java-小议计算机内存&字节

    内存:计算机内存是由一个有序的字节序列组成,用于存储程序及程序需要的数据。你可以将内存想象成计算机执行程序的工作区域。一个程序和它的数据在被CPU执行前必须移...

    老九学堂-小师弟
  • C语言控制台版万年历

    4.然后根据下图可以看出,该月的1号是星期几,我们在控制台上,就需要在前面打印几个\t控制符,比如2016年10月1日是星期六,那么前面我们就需要六个\t来制造...

    老九学堂-小师弟
  • Linux中配置Java开发环境

    rpm是管理套件命令,-qa表示使用询问模式查询所有套件;grep表示查询文件里符合条件的字符串;java表示查询包含java的字符串

    老九学堂-小师弟
  • 大会活动|2019世界人工智能大会|视觉AI回归理性,腾讯优图加速产业数字化升级

    作为腾讯旗下顶级人工智能实验室之一,优图以计算机视觉技术为核心,专注人脸、人体、交通、医疗影像、自动驾驶等视觉领域的前沿研究和产品落地,为各行各业提供了超过15...

    优图实验室
  • 优图动态|优图仅用两年刷新哼唱世界纪录,腾讯继续推动技术创新

    近日,腾讯优图团队在2015国际权威音频检索评测大赛MIREX中表现优异,在哼唱识别比赛中取得两个世界第一,两个世界第二的成绩。其中,在数据集IOACAS上,优...

    优图实验室
  • IBM宣称人类语音识别词错率实际应为5.1%,自家系统已突破至5.5%

    选自IBM 作者:George Saon 机器之心编译 参与:吴攀、黄小天 去年十月,微软人工智能与研究部门的一个研究者和工程师团队报告他们的语音识别系统实现了...

    机器之心
  • IDC:2019年全球VR/AR头显出货量将达到890万

    根据IDC 3月28日的报告《Worldwide Quarterly Augmented and Virtual Reality Headset Tracker...

    VRPinea
  • Linux C语言链表详细分析

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类...

    用户6754675
  • file_get_contents()

    今天遇到一个非常棘手的问题,然后我就突然发现这个函数竟然可以这样用~~ $data = file_get_contents(“/var/www/1.jpg”) ...

    苦咖啡
  • Interspeech 2019 | 基于多模态对齐的语音情感识别

    语音领域顶级学术会议 Interspeech于2019年9月15-19日在奥地利格拉茨举行。

    AI科技评论

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动