realloc原型是extern void *realloc(void *mem_address, unsigned int newsize);
基本介紹
- 中文名:動態記憶體調整
- 外文名:reset allocation
- 別名:realloc
- 原型:extern void *realloc
- 相關函式:malloc、calloc、free、_alloca
- 注意事項:重分配成功舊記憶體會被自動釋放,舊指針變成了野指針
函式說明
語法
頭檔案
功能
返回值
注意
套用舉例
舉例1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
int*pn=(int*)malloc(5*sizeof(int));
if (!pn) {
printf("malloc fail\n");
exit(-1);
}
printf("malloc%p\n",pn);
for(i=0;i<5;i++)
pn[i]=i;
pn=(int*)realloc(pn,10*sizeof(int));
if (!pn) {
printf("realloc fail\n");
exit(-1);
}
printf("realloc%p\n",pn);
for(i=5;i<10;i++)
pn[i]=i;
for(i=0;i<10;i++)
printf("%3d",pn[i]);
free(pn);
pn = NULL;
return 0;
}
舉例2
//realloc.c
#include<syslib.h>
#include<alloc.h>
main()
{
char*p;
clrscr();//clearscreen
p=(char*)malloc(100);
if(p)
printf("MemoryAllocatedat:%x",p);
else
printf("NotEnoughMemory!\n");
getchar();
p=(char*)realloc(p,256);
if(p)
printf("MemoryReallocatedat:%x",p);
else
printf("NotEnoughMemory!\n");
free(p);
getchar();
return 0;
}
記憶體分配
- 如果有足夠空間用於擴大mem_address指向的記憶體塊,則分配額外記憶體,並返回mem_address。這裡說的是“擴大”,我們知道,realloc是從堆上分配記憶體的,當擴大一塊記憶體空間時, realloc()試圖直接從堆上現存的數據後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平。也就是說,如果原先的記憶體大小後面還有足夠的空閒空間用來分配,加上原來的空間大小= newsize。那么就ok。得到的是一塊連續的記憶體。
- 如果原先的記憶體大小後面沒有足夠的空閒空間用來分配,那么從堆中另外找一塊newsize大小的記憶體。並把原來大小記憶體空間中的內容複製到newsize中。返回新的mem_address指針。(數據被移動了)。老塊被放回堆上。
#include<malloc.h>
voidmain()
{
char*p,*q;
p=(char*)malloc(10);
q=p;
p=(char*)realloc(q,20);//A行,通過realloc擴大p的空間,並把新的地址賦值給p。
//…………………………
}
返回情況
特殊情況
#include <stdio.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
char *p,*q;
p = (char *)malloc(10);
q = p;
p = (char *)realloc(p,10);
printf("p=0x%x/n",p);
printf("q=0x%x/n",q);
return 0;
}
//輸出結果:realloc後,記憶體地址不變
//p=0x431a70
//q=0x431a70
#include <stdio.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
char *p,*q;
p = (char *)malloc(10);
q = p;
p = (char *)realloc(p,1000);
printf("p=0x%x/n",p);
printf("q=0x%x/n",q);
return 0;
}
//輸出結果:realloc後,記憶體地址發生了變化
//p=0x351c0
//q=0x431a70