malloc的用法

语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失!

头文件:#include <stdlib.h>

功能:先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

 

举例1:

 

从这个例子可以看出realloc函数的功能。

 

#include<stdio.h>

 

#include<stdlib.h>

 

int main()

 

{

 

int i;

 

int *pn=(int *)malloc(5*sizeof(int));

 

printf("%p\n",pn);

 

for(i=0;i<5;i++)

 

scanf("%d",&pn[i]);

 

pn=(int *)realloc(pn,10*sizeof(int));

 

printf("%p\n",pn);

 

for(i=0;i<5;i++)

 

printf("%3d",pn[i]);

 

printf("\n");

 

free(pn);

 

return 0;

 

}
<1>如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。
这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。
<2>如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。
并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。
老块被放回堆上。
 
 
 

 

posted on 2013-10-31 12:17  天天小鱼  阅读(233)  评论(0编辑  收藏  举报

导航