美文网首页
【C语言进阶】内置函数补充

【C语言进阶】内置函数补充

作者: 老九君 | 来源:发表于2019-08-05 17:47 被阅读0次

内置函数补充

原型:

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

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

老九学堂出品,转载请私信哦

对于文章内容有不理解的可以添加老九君个人QQ:614940318,请备注来自简书

老九学堂免费C、C++、Java课程地址:

https://study.163.com/courses-search?keyword=%E8%80%81%E4%B9%9D%E5%AD%A6%E5%A0%82

相关文章

网友评论

      本文标题:【C语言进阶】内置函数补充

      本文链接:https://www.haomeiwen.com/subject/dufvdctx.html