- 相關(guān)推薦
C語言入門知識(shí):realloc函數(shù)
導(dǎo)語:realloc原型是extern void *realloc(void *mem_address, unsigned int newsize);下面是其函數(shù)的相關(guān)知識(shí),歡迎學(xué)習(xí):
函數(shù)說明
語法
指針名=(數(shù)據(jù)類型*)realloc(要改變內(nèi)存大小的指針名,新的大小)。
新的大小可大可小(但是要注意,如果新的大小小于原內(nèi)存大小,可能會(huì)導(dǎo)致數(shù)據(jù)丟失,慎用!)
頭文件
#include
功能
先判斷當(dāng)前的指針是否有足夠的連續(xù)空間,如果有,擴(kuò)大mem_address指向的地址,并且將mem_address返回,如果空間不夠,先按照newsize指定的大小分配空間,將原有數(shù)據(jù)從頭到尾拷貝到新分配的內(nèi)存區(qū)域,而后釋放原來mem_address所指內(nèi)存區(qū)域(注意:原來指針是自動(dòng)釋放,不需要使用free),同時(shí)返回新分配的內(nèi)存區(qū)域的首地址。即重新分配存儲(chǔ)器塊的地址。
返回值
如果重新分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。
注意
當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。
相關(guān)函數(shù)
1
malloc、calloc、free、_alloca
應(yīng)用舉例
舉例1
從這個(gè)例子可以看出realloc函數(shù)的功能。
運(yùn)行環(huán)境:ubuntu 12.04 GCC 4.6.3
運(yùn)行結(jié)果:
malloc 0x904f008
realloc 0x904f008
0 1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include
#include
int main()
{
inti;
int*pn=(int*)malloc(5*sizeof(int));
printf("malloc%p ",pn);
for(i=0;i<5;i++)
pn[i]=i;
pn=(int*)realloc(pn,10*sizeof(int));
printf("realloc%p ",pn);
for(i=5;i<10;i++)
pn[i]=i;
for(i=0;i<10;i++)
printf("%3d",pn[i]);
free(pn);
return 0;
}
舉例2
:(在TC2.0中運(yùn)行通過)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//realloc.c
#include
#include
main()
{
char*p;
clrscr();//clearscreen
p=(char*)malloc(100);
if(p)
printf("MemoryAllocatedat:%x",p);
else
printf("NotEnoughMemory! ");
get);
p=(char*)realloc(p,256);
if(p)
printf("MemoryReallocatedat:%x",p);
else
printf("NotEnoughMemory! ");
free(p);
get);
return 0;
}
內(nèi)存分配編輯
如果有足夠空間用于擴(kuò)大mem_address指向的內(nèi)存塊,則分配額外內(nèi)存,并返回mem_address。
這里說的是“擴(kuò)大”,我們知道,realloc是從堆上分配內(nèi)存的,當(dāng)擴(kuò)大一塊內(nèi)存空間時(shí), realloc()試圖直接從堆上現(xiàn)存的數(shù)據(jù)后面的那些字節(jié)中獲得附加的字節(jié),如果能夠滿足,自然天下太平。也就是說,如果原先的內(nèi)存大小后面還有足夠的空閑空間用來分配,加上原來的空間大小= newsize。那么就ok。得到的是一塊連續(xù)的內(nèi)存。
如果原先的內(nèi)存大小后面沒有足夠的空閑空間用來分配,那么從堆中另外找一塊newsize大小的內(nèi)存。
并把原來大小內(nèi)存空間中的內(nèi)容復(fù)制到newsize中。返回新的mem_address指針。(數(shù)據(jù)被移動(dòng)了)。
老塊被放回堆上。
例如
1
2
3
4
5
6
7
8
9
#include
voidmain()
{
char*p,*q;
p=(char*)malloc(10);
q=p;
p=(char*)realloc(q,20);//A行,通過realloc擴(kuò)大p的空間,并把新的地址賦值給p。
//…………………………
}
在這段程序中我們增加了指針q,用它記錄了原來的內(nèi)存地址p。這段程序可以編譯通過,但在執(zhí)行到A行時(shí),如果原有內(nèi)存后面沒有足夠空間將原有空間擴(kuò)展成一個(gè)連續(xù)的新大小的話,realloc函數(shù)就會(huì)以第二種方式分配內(nèi)存,此時(shí)數(shù)據(jù)發(fā)生了移動(dòng),那么所記錄的原來的內(nèi)存地址q所指向的內(nèi)存空間實(shí)際上已經(jīng)放回到堆上了!這樣就會(huì)產(chǎn)生q指針的指針懸掛,即指針指向了一塊沒有分配給用戶使用的內(nèi)存,如果再用q指針進(jìn)行操作就可能發(fā)生意想不到的問題。所以在應(yīng)用realloc函數(shù)是應(yīng)當(dāng)格外注意這種情況。
返回情況
返回的是一個(gè)void類型的指針:調(diào)用成功。(這就要求在你需要的時(shí)候進(jìn)行強(qiáng)制類型轉(zhuǎn)換)
返回NULL:當(dāng)需要擴(kuò)展的大小(第二個(gè)參數(shù))為0并且第一個(gè)參數(shù)不為NULL時(shí)。此時(shí)原內(nèi)存變成“free(游離)”的了。
返回NULL:當(dāng)沒有足夠的空間可供擴(kuò)展的時(shí)候。此時(shí),原內(nèi)存空間的大小維持不變。
特殊情況
如果mem_address為NULL,則realloc()和malloc()類似。分配一個(gè)newsize的內(nèi)存塊,返回一個(gè)指向該內(nèi)存塊的指針。
如果newsize大小為0,那么釋放mem_address指向的內(nèi)存,并返回NULL。
如果沒有足夠可用的內(nèi)存用來完成重新分配(擴(kuò)大原來的內(nèi)存塊或者分配新的內(nèi)存塊),則返回NULL。而原來的內(nèi)存塊保持不變。
現(xiàn)存的數(shù)據(jù)然后就被拷貝至新的位置,而老塊則放回到堆上.重要的信息就是數(shù)據(jù)可能被移動(dòng)
#include
#include
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;
}
輸出結(jié)果:realloc后,內(nèi)存地址不變
p=0x431a70
q=0x431a70
例2:
#include
#include
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;
}
輸出結(jié)果:realloc后,內(nèi)存地址發(fā)生了變化
p=0x351c0
q=0x431a70
例
1 #include
2 #include
3 #include
4
5 int main(int argc, char **argv){
6
7 char *p, *p2, *pnew;
8 int offset = 0;
9
10 p = (char *)malloc(10);
11 if(!p){
12 printf("malloc p error ");
13 }
14 strcpy(p, "Hello,");
15 p2 = strchr(p,',');
16 offset = p2-p+1;
17
18 pnew = (char *)realloc((void *)p, 20);
19
20 if(pnew){
21 p = pnew;
22 p2 = pnew + offset;
23 strcpy(p2," world");
24 }
25 printf("string is: %s ",p);
26 return 0;
27 }
執(zhí)行結(jié)果:string is: Hello, world
使用總結(jié)
1. realloc失敗的時(shí)候,返回NULL
2. realloc失敗的時(shí)候,原來的內(nèi)存不改變,不會(huì)釋放也不會(huì)移動(dòng)
3. 假如原來的內(nèi)存后面還有足夠多剩余內(nèi)存的話,realloc的內(nèi)存=原來的內(nèi)存+剩余內(nèi)存,realloc還是返回原來內(nèi)存的地址; 假如原來的內(nèi)存后面沒有足夠多剩余內(nèi)存的話,realloc將申請新的內(nèi)存,然后把原來的內(nèi)存數(shù)據(jù)拷貝到新內(nèi)存里,原來的內(nèi)存將被free掉,realloc返回新內(nèi)存的地址
4. 如果size為0,效果等同于free()。這里需要注意的是只對指針本身進(jìn)行釋放,例如對二維指針**a,對a調(diào)用realloc時(shí)只會(huì)釋放一維,使用時(shí)謹(jǐn)防內(nèi)存泄露。
5. 傳遞給realloc的指針必須是先前通過malloc(), calloc(), 或realloc()分配的
6.傳遞給realloc的指針可以為空,等同于malloc。
【C語言入門知識(shí):realloc函數(shù)】相關(guān)文章:
C語言入門知識(shí):strstr函數(shù)03-28
C語言入門知識(shí):strchr函數(shù)07-24
C語言入門知識(shí)07-20
C語言入門必備知識(shí)04-12
C語言入門知識(shí):常量08-31
C語言中g(shù)ets()函數(shù)知識(shí)08-10
c語言入門基礎(chǔ)知識(shí)07-18