C語(yǔ)言 realloc()函數(shù)
realloc()函數(shù)的原型如下:
void *rea11oc(void *ptr, size_t size);
使用該函數(shù)要包含頭文件stdlib.h,其功能是改變ptr指針指向的空間大小,為size大小。size大小可以是任意的,也就是說(shuō)既可以比原來(lái)的數(shù)值大,也可以比原來(lái)的數(shù)值小。返回值是一個(gè)指向新地址的指針,如果出現(xiàn)錯(cuò)誤,則返回NULL。例如,改變一個(gè)分配的實(shí)型空間大小成為整型大?。?/p>
fDouble=(double*)malloc(sizeof(double));
ilnt=realloc(fDouble, sizeof(int));
其中,fDouble是指向分配的實(shí)型空間,之后使用realloc()函數(shù)改變fDouble指向的空間的大小,其大小設(shè)置為整型,然后將改變后的內(nèi)存空間的地址返回賦值給ilnt整型指針。
【例題】記錄內(nèi)存地址
程序如下:
#include<malloc.h>
voidmain()
{
char*p, *q;
p=(char*)malloc(10);
q=p;
p=(char*)realloc(q,20);
//A行,通過(guò)realloc擴(kuò)大p的空間,并把新的地址賦值給p
//………………
}
在這段程序中我們?cè)黾恿酥羔榪,用它記錄原來(lái)的內(nèi)存地址p。這段程序可以編譯通過(guò),但在執(zhí)行到A行時(shí),如果原有內(nèi)存后面沒(méi)有足夠空間將原有空間擴(kuò)展成一個(gè)連續(xù)的新大小的話,realloc()函數(shù)就會(huì)以第二種方式分配內(nèi)存。此時(shí)數(shù)據(jù)發(fā)生了移動(dòng),那么所記錄的原來(lái)的內(nèi)存地址q所指向的內(nèi)存空間實(shí)際上已經(jīng)放回到堆上了。這樣就會(huì)產(chǎn)生q指針的指針懸掛,即指針指向了一塊沒(méi)有分配給用戶使用的內(nèi)存,如 果再用q指針進(jìn)行操作就可能發(fā)生意想不到的問(wèn)題。所以在應(yīng)用reallocO函數(shù)時(shí)應(yīng)當(dāng)格外注意這種情況。
點(diǎn)擊加載更多評(píng)論>>