用法:#include <stdlib.h> 有些編譯器需要#include <alloc.h>
功能:改變mem_address所指記憶體區域的大小為newsize長度。
說明:如果重新分配成功則返回指向被分配記憶體的指針,否則返回空指針NULL。
當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
注意:這裡原始記憶體中的數據還是保持不變的。
舉例:
// realloc.c
#include <syslib.h>
#include <alloc.h>
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 <malloc.h>
void main()
{
char *p,*q;
p = (char * ) malloc (10);
q=p;
p = (char * ) realloc (p,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.而原來的記憶體塊保持不變。
相關詞條
-
realloc函式
realloc函式,是一個編程函式,作用為改變mem_address所指記憶體區域的大小為newsize長度。
-
realloc
realloc原型是extern void *realloc(void *mem_address, unsigned int newsize);
函式說明 套用舉例 記憶體分配 返回情況 特殊情況 -
realloc()
#include stdlib.h void *realloc( void *ptr,size_t size ); 功能: 函式將ptr 對象的儲存空間改變為給定的大小size。 參數size可以是...
-
C語言函式
C語言函式是一種函式,用來編譯C語言,所在庫函式為ctype.h,分為分類函式,數學函式,目錄函式,進程函式,診斷函式,操作函式等。
分類函式 數學函式 目錄函式 進程函式 診斷函式 -
malloc函式
malloc的全稱是memory allocation,中文叫動態記憶體分配,用於申請一塊連續的指定大小的記憶體塊區域以void*類型返回分配的記憶體區域地址...
函式定義 與new的區別 工作機制 程式示例 -
C語言開發技術詳解
/輸出函式的使用,包括printf函式、scanf函式、getchar函式、getch函式、gets函式、putch函式、puts函式等的使用...10章介紹在C語言中創建和使用函式的方法,包括函式的概念、編寫函式、設定函式...
宣傳語 前言 目錄 -
cstdlib
記憶體不夠,返回04函式名稱: realloc函式原型: void * realloc(void * p,unsigned size);函式功能...記憶體函式:calloc,free,malloc,realloc環境函式...
介紹 包含函式 附 -
stdlib.h
不夠,返回04函式名稱: realloc函式原型: void * realloc(void * p,unsigned size);函式功能: 將...庫函式頭檔案stdlib 頭檔案里包含了C、C++語言的最常用的系統函式該...
檔案簡介 檔案內容 包含的函式 -
C語言程式設計:現代方法:第2版
指令 92.2.2 函式 92.2.3 語句 102.2.4 顯示...編程題 24第3章 格式化輸入/輸出 263.1 printf函式 263.1.1 轉換說明 27程式 用printf函式格式化數...
基本信息 內容簡介 作者 目錄