C語言函式realloc

2021-05-24 00:05:26 字數 2610 閱讀 9228

原型:extern void *realloc(void *mem_address, unsigned int newsize);

語法:指標名=(資料型別*)realloc(要改變記憶體大小的指標名,新的大小)。

標頭檔案:#include 有些編譯器需要#include ,在tc2.0中可以使用alloc.h標頭檔案

功能:先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來mem_address所指記憶體區域,同時返回新分配的記憶體區域的首位址。即重新分配儲存器塊的位址。

返回值:如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。 

注意:這裡原始記憶體中的資料還是保持不變的。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

malloc、calloc、free、_alloca

舉例1:

從這個例子可以看出realloc函式的功能。

#include

#include

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;

舉例2:(在tc2.0中執行通過)

// realloc.c

#include

#include

main()

char *p;

clrscr(); // clear screen

p=(char *)malloc(100);

if(p)

printf("memory allocated at: %x",p);

else

printf("not enough memory!/n");

getchar();

p=(char *)realloc(p,256);

if(p)

printf("memory reallocated at: %x",p);

else

printf("not enough memory!/n");

free(p);

getchar();

return 0;

1、如果有足夠空間用於擴大mem_address指向的記憶體塊,則分配額外記憶體,並返回mem_address

這裡說的是「擴大」,我們知道,realloc是從堆上分配記憶體的,當擴大一塊記憶體空間時, realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平。也就是說,如果原先的記憶體大小後面還有足夠的空閒空間用來分配,加上原來的空間大小= newsize。那麼就ok。得到的是一塊連續的記憶體。

2、如果原先的記憶體大小後面沒有足夠的空閒空間用來分配,那麼從堆中另外找一塊newsize大小的記憶體。

並把原來大小記憶體空間中的內容複製到newsize中。返回新的mem_address指標。(資料被移動了)。

老塊被放回堆上。

例如:

#include

void main()

char *p,*q;

p = (char * ) malloc (10);

q=p;

p = (char * ) realloc (q,20); //a

在這段程式中我們增加了指標q,用它記錄了原來的記憶體位址p。這段程式可以編譯通過,但在執行到a行時,如果原有記憶體後面沒有足夠空間將原有空間擴充套件成乙個連續的新大小的話,realloc函式就會以第二種方式分配記憶體,此時資料發生了移動,那麼所記錄的原來的記憶體位址q所指向的記憶體空間實際上已經放回到堆上了!這樣就會產生q指標的指標懸掛,如果再用q指標進行操作就可能發生意想不到的問題。所以在應用realloc函式是應當格外注意這種情況。

3、返回情況

返回的是乙個void型別的指標,呼叫成功。(這就再你需要的時候進行強制型別轉換)

返回null,當需要擴充套件的大小(第二個引數)為0並且第乙個引數不為null,此時原記憶體變成了「freed(游離)」的了。

返回null,當沒有足夠的空間可供擴充套件的時候,此時,原記憶體空間的大小維持不變。

4、特殊情況

如果mem_address為null,則realloc()和malloc()類似。分配乙個newsize的記憶體塊,返回乙個指向該記憶體塊的指標。

如果newsize大小為0,那麼釋放mem_address指向的記憶體,並返回null。

如果沒有足夠可用的記憶體用來完成重新分配(擴大原來的記憶體塊或者分配新的記憶體塊),則返回null.而原來的記憶體塊保持不變。

C語言realloc函式解析

在網上查了很多資料,終於大概知道了這個函式的原理 void realloc void ptr,size t size 作用 更改已經配置的堆記憶體空間,說白了在c語言中就是更改由malloc 函式分配的記憶體空間的大小。當需要將已分配的記憶體減小時,則返回原指標,僅僅是對應索引的記憶體空間減小了 當...

c語言中realloc 函式解析

realloc void ptr,size t size 更改已經配置的記憶體空間,即更改由malloc 函式分配的記憶體空間的大小。如果將分配的記憶體減少,realloc僅僅是改變索引的資訊。如果是將分配的記憶體擴大,則有以下情況 1 如果當前記憶體段後面有需要的記憶體空間,則直接擴充套件這段記憶...

安全起見,小心使用C語言realloc 函式

在c語言中,良好的程式設計習慣要求乙個函式只做一件事,如果乙個函式實現了若干功能,可以說基本是乙個糟糕的設計。c語言 realloc 函式位於 stdlib.h 標頭檔案中,其原型為 void realloc void ptr,size t size void 意思是這個函式返回的是指標變數。voi...