c realloc函数和malloc函数

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指针。(数据被移动了)。 
老块被放回堆上。 

原文地址:https://www.cnblogs.com/myyan/p/3745028.html