C語言的動態分配函式
阿新 • • 發佈:2019-01-27
動態分配函式的核心是malloc()和free()。每次呼叫malloc()時,均分配剩餘的記憶體的一部分;每次呼叫free()時,均向系統返還記憶體。被分配的空記憶體區中的記憶體叫做堆(heap)。動態分配函式的原型在<stdlib.h>中。
標準C定義了4種動態分配函式,可以用於所有的編譯程式。它們是:calloc(),malloc(),free()和realloc()。
(1)calloc
void *calloc(size_t num, size_t size);
函式calloc()分配的記憶體量等於num*size,即calloc()為num個大小為size的陣列分配足夠記憶體。分配記憶體中的所有位被初始化為零。
calloc()返回一個指標,指向分得區域的第一位元組。記憶體不足以滿足請求時,返回空指標。因此,使用返回指標前,必須先檢查它是否為空指標。
//返回指向動態分配的100個浮點數的指標
#include <stdlib.h>
#include <stdio.h>
float *get_mem()
{
float *p;
p=calloc(100,sizeof(float));
if(!p){
printf("Allocation Error\n");
exit(1);
}
return p;
}
(2)free
void free(void *ptr);
函式free()向堆中返回ptr指向的記憶體,使記憶體可供將來再分配。
呼叫free()的指標必須是先前用動態分配系統函式()malloc(),realloc()及calloc())之一所分配而取得的。用無效指標呼叫free()可能摧毀記憶體管理機制,使系統癱瘓。
(3)malloc
void *malloc(size_t size);
函式malloc()返回一個指標,指向從堆中分配的size位元組記憶體區的首位元組。堆中記憶體不足時,返回空指標。使用前,必須核實返回的指標不為空。否則將導致系統癱瘓。
(4)realloc
void *realloc(void *ptr, size_t size);
操作後會分配一個新塊,新塊包含著與舊塊(最大為傳入的長度,用size表示)相同的內容。指向新塊的指標被返回。新快和舊塊可以從同一地址開始。因此realloc()返回的指標可以與傳入ptr的指標相同。如果ptr是空指標,則realloc()僅分配size位元組的記憶體,併為其返回一個指標。
如果記憶體不足,則返回空指標,且原塊不變。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char *p;
//最初通過malloc()函式只分配17個位元組
p = malloc(17);
if(!p) {
printf("Allocation Error\n");
exit(1);
}
strcpy(p, "This is 16 chars");
//通過realloc()函式將原記憶體擴大到18個位元組,多出的一個位元組用以存放句點
p = realloc(p, 18);
if(!p) {
printf("Allocation Error\n");
exit(1);
}
strcat(p, ".");
printf(p);
free(p);
return 0;
}
執行結果: