realloc
原型:extern void *realloc(void
*mem_address, unsigned int newsize);
用法:#include
<stdlib.h> 有些编译器需要#include <alloc.h>
在C++环境中,使用#include<iostream> using namespace
std;
功能:改变mem_address所指内存区域的大小为newsize长度。
说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
注意:这里原始内存中的数据还是保持不变的。
举例如下:
int
*a1=(int*)malloc(2*sizeof(int));
a1[0]=2;
a1[1]=3;
cout<<(int*)a1<<endl;
a1=(int
*)realloc(a1,4*sizeof(int));
cout<<(int*)a1<<endl;
a1[2]=4;
a1[3]=5;
for(int
i=0;i<=3;i++)
cout<<a1[i]<<endl;
运行结果:
00672DF0
00672DF0
2
3
4
5
详细说明及注意要点:
1、如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address
这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时,
realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小=
newsize。那么就ok。得到的是一块连续的内存。
2、如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。
并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。
老块被放回堆上。
c realloc函数和malloc函数,布布扣,bubuko.com
原文:http://www.cnblogs.com/myyan/p/3745028.html