ansi c說明了三個用於儲存空間動態分配的函式
(1) malloc 分配指定位元組數的儲存區。此儲存區中的初始值不確定
(2) calloc 為指定長度的物件,分配能容納其指定個數的儲存空間。該空間中的每一位(bit)都初始化為0
(3) realloc 更改以前分配區的長度(增加或減少)。當增加長度時,可能需將以前分配區的內容移到另乙個足夠大的區域,而新增區域內的初始值則不確定。
分配函式時再分配 realloc() ,使我們可以增、減以前分配區的長度(最常見的用法是增加該區)。如果先分配乙個可容納長度為512的陣列的空間,並在執行時填充它,但又發現空間不夠,則可呼叫realloc擴充該儲存空間。如果在該儲存區後有足夠的空間可供擴充,則可在原儲存區位置上向高位址方向擴充,並返回傳送給它的同樣的指標值。如果在原儲存區後沒有足夠的空間,則realloc分配另乙個足夠大的儲存區,將現存的512個元素陣列的內容複製到新分配的儲存區。因為這種儲存區可能會移動位置,所以不應當使用任何指標指在該區中。注意,realloc的最後乙個引數是儲存區的newsize(新長度),不是新、舊長度之差。作為乙個特例,若ptr是乙個空指標,則realloc的功能與malloc相同,用於分配乙個指定長度newsize的儲存區。
malloc的引數就是所需分配的位元組數,malloc在c語言中不是關鍵字而是c函式庫中提供的函式。呼叫malloc時就是在記憶體池中提取一塊連續的空間,並返回這塊記憶體的指標。**示例:
#include #include typedef struct node
node;
node *create(int n)
s->next = head->next;
} free(head);
return s->next ;
}
void realloc(void *ptr,size_t new_size); ptr是指向原來位址的指標,這個函式用於修改乙個原先已經分配記憶體塊的大小。
使用:1.可以使一塊記憶體擴大或縮小(原來的記憶體塊可以擴大縮小)
(1.)如果是擴大乙個記憶體塊,則將原來的記憶體塊保留在他的後邊新增一塊記憶體塊(但是新增的記憶體塊並未初始化)
(2.)如果是縮小一塊記憶體塊,則將該記憶體塊的後半部分直接拿掉,剩餘部分記憶體塊及其內容保留。
2.原來的記憶體塊無法擴大縮小
如果是著這種情況,realloc會重新開闢乙個新的記憶體空間,並把原來的記憶體空間的內容拷貝到新的記憶體空間裡。
注意:再呼叫完realloc後就不能使用指向就記憶體的指標,而是用返回的新的指標。
記憶體擴充套件如圖所示。
值得一提的是:如果realloc中的第乙個引數如果為空則和malloc一樣。
引用:
malloc與realloc的區別
ansi c說明了三個用於儲存空間動態分配的函式 1 malloc 分配指定位元組數的儲存區。此儲存區中的初始值不確定 2 calloc 為指定長度的物件,分配能容納其指定個數的儲存空間。該空間中的每一位 bit 都初始化為0 3 realloc 更改以前分配區的長度 增加或減少 當增加長度時,可能...
malloc與realloc的區別
在程式的執行期間分配記憶體時,記憶體區域中的這個空間稱為堆 heap 還有另乙個記憶體區域,稱為棧 stack 其中的空間分配給函式的引數和本地變數。在執行完該函式後,儲存引數和本地變數的記憶體空間就會釋放。堆中的記憶體是由程式設計師控制的。在分配堆上的記憶體時,由程式設計師跟蹤所分配的記憶體何時不...
malloc函式與realloc函式
malloc函式與realloc函式 動態儲存必備 malloc函式 malloc函式簡介 原型 extern void malloc unsigned int num bytes 標頭檔案 include 或 include 注意 alloc.h 與 malloc.h 的內容是完全一致的。功能 分...