realloc使用详解

简介:
分析realloc invalid pointer、指针无效等错误!
realloc函数用来为ptr重新分配大小为size的一块内存,看似很简单,在使用过程中却会发生各种错误。

函数形式为:
void * realloc ( void * ptr, size_t new_size );
最近在网上查看了一些资料,在glibc中没有找到具体的实现(有人找到了可以发给我,ladd.cn@gmail.com),查到了一个开源项目自己写的realloc代码,http://code.google.com/p/mallocspethmeniel/source/browse/trunk/realloc.c?r=23,应该和stdlib里面的实现流程一样。
下面是我画出的函数流程图

realloc 函数流程图

这个函数的工作流程:
1.对ptr进行判断,如果ptr为NULL,则函数相当于malloc(new_size),试着分配一块大小为new_size的内存,如果成功将地址返回,否则返回NULL。如果ptr不为NULL,则进入2
2.查看ptr是不是在堆中,如果不是的话会跑出异常错误,会发生realloc invalid pointer(具体原因在后面讲)。如果ptr在堆中,则查看new_size大小,如果new_size大小为0,则相当于free(ptr),讲ptr指针释放,返回NULL,如果new_size小于原大小,则ptr中的数据可能会丢失,只有new_size大小的数据会保存(这里很重要),如果size等于原大小,等于啥都没做,如果size大于原大小,则看ptr所在的位置还有没有足够的连续内存空间,如果有的话,分配更多的空间,返回的地址和ptr相同,如果没有的话,在更大的空间内查找,如果找到size大小的空间,将旧的内容拷贝到新的内存中,把旧的内存释放掉,则返回新地址,否则返回NULL。
这里解释一下,为什么ptr要在堆中,学过编译原理的同学应该都知道C语言中的malloc,realloc,calloc()这种用户主动分配的内存放在堆区,而临时变量放在栈区,这是两块不同的区域。堆区的变量由用户通过free释放空间,而栈区的变量在函数退出后就自动释放,所以这两个区域的变量生存时间不同,不能相互间进行内存分配操作。所以要求ptr必须在堆区,即ptr必须是malloc,realloc或者calloc的返回值,要不然可以为NULL,把realloc变为malloc。
所以使用realloc函数应该注意一下几点:
1.ptr必须为NULL,或者为malloc,realloc或者calloc的返回值,否则发生realloc invalid pointer错误
2.new_size如果小于old_size,只有new_size大小的数据会被保存,可能会发生数据丢失,慎重使用。
3.如果new_size大于old_size,可能会分配一块新的内存,这时候ptr指向的内存会被释放,ptr成为野指针,再访问的时候会发生错误。
4.最后不要将返回结果再赋值给ptr,即ptr=realloc(ptr,new_size)是不建议使用的,因为如果内存分配失败,ptr会变为NULL,如果之前没有将ptr所在地址赋给其他值的话,会发生无法访问旧内存空间的情况,所以建议使用temp=realloc(ptr,new_size)。
参考文章:
1.function realloc  http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
2.realloc.c http://code.google.com/p/mallocspethmeniel/source/browse/trunk/realloc.c?r=23

转自:

http://www.cnblogs.com/ladd/archive/2012/06/30/2571420.html





本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/archive/2012/12/21/2827826.html,如需转载请自行联系原作者

目录
相关文章
|
安全 编译器 C语言
动态内存管理(malloc、calloc、realloc)详解
动态内存管理(malloc、calloc、realloc)详解
259 0
|
5月前
|
存储 C语言
malloc
【6月更文挑战第16天】
67 8
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
153 1
|
4月前
|
存储 编译器 程序员
【C/C++】动态内存管理(C:malloc,realloc,calloc,free)
探索C++与C语言的动态内存管理:从malloc到new/delete,了解内存分布及栈、堆的区别。文章涵盖malloc、realloc、calloc与free在C中的使用,强调内存泄漏的风险。C++引入new和delete,支持对象构造与析构,还包括operator new和placement-new。深入分析内存管理机制,揭示C与C++在内存处理上的异同。别忘了,正确释放内存至关重要!
|
6月前
|
编译器
练习使用动态内存相关的4个函数:malloc、calloc、realloc、free
在了解使用动态内存相关的四个函数之前,我们先了解一下,为什么要有动态内存分配?
66 0
|
6月前
|
程序员 编译器 C语言
C语言知识:动态内存管理(malloc free calloc realloc)
C语言知识:动态内存管理(malloc free calloc realloc)
|
编译器 算法 C语言
动态内存函数详解-【malloc,calloc,realloc,free】
动态内存函数详解-【malloc,calloc,realloc,free】
动态内存函数详解-【malloc,calloc,realloc,free】
|
6月前
|
存储 程序员 编译器
动态内存分配(malloc和free​、calloc和realloc​)
动态内存分配(malloc和free​、calloc和realloc​)
|
编译器 C语言
动态内存分配—malloc calloc realloc free 和常见动态内存错误
我们熟知的内存开辟方式有两种:第一种便是通过等关键字为变量开辟空间;第二种便是通过开辟一段连续的空间。这样开辟的空间很局限:1. 空间开辟大小是固定的。2. 数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配。动态内存分配所开辟的空间在堆区,并且是可以扩容的。
107 1
|
编译器
C进阶:动态内存函数 malloc calloc realloc free及常见动态内存开辟错误(下)
C进阶:动态内存函数 malloc calloc realloc free及常见动态内存开辟错误(下)
65 1