前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言进阶内置函数补充

C语言进阶内置函数补充

原创
作者头像
老九学堂-小师弟
修改2019-09-19 18:23:22
6440
修改2019-09-19 18:23:22
举报
文章被收录于专栏:编程语言xuetang编程语言xuetang

原型:

用法:#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(即内存泄漏)了。

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

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档