四個函數的聲明分別是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t nelem, size_t elsize);
free(q); //其中q為已經分配的塊;
四個函數都被包含在stdlib.h函數庫內。
C語言的標準記憶體配置函數:malloc,calloc,realloc等:
malloc與calloc的區別為1塊與n塊以及是否初始化的區別:
malloc調用形式為(類型*)malloc(size):在記憶體的動態儲存裝置區中分配一塊長度為"size"位元組的連續地區,返回該地區的首地址。如果記憶體沒有分配好,則傳回值是NULL。對於分配到的記憶體塊並沒有進行初始化操作。這塊記憶體可能包含任何隨機的垃圾,你可以馬上用有效資料或者至少是用零來初始化這塊記憶體。要用0初始化,可以用void *memset(void *s, int c, size_t n);
malloc用於申請一段新的地址,參數size為需要記憶體空間的長度,如:
char* p;
p=(char*)malloc(20); //這裡有一個顯示類型轉化,由void*轉化為char*
calloc調用形式為(類型*)calloc(n,size):在記憶體的動態儲存裝置區中分配n塊長度為"size"位元組的連續地區,返回首地址。對於分配到的記憶體塊初始化為0,無需要使用memset初始化。有經驗的程式員更喜歡使用calloc(),因為這樣的話新分配記憶體的內容就不會有什麼問題,調用calloc()肯定會清0。
calloc與malloc相似,參數sizeOfElement為申請地址的單位元素長度,numElements為元素個數,如:
char* p;
p=(char*)calloc(20,sizeof(char));
realloc 不能保證重新分配後的記憶體空間和原來的記憶體空間指在同一記憶體位址, 它返回的指標很可能指向一個新的地址。
所以,在代碼中,必須把realloc返回的值,重新賦給 p 如:
p = (char *) realloc (p, old_size + new_size);
甚至,你可以傳一個null 指標(0)給 realloc ,則此時realloc 作用完全相當於malloc。
int* p = (char *) realloc (0,old_size + new_size); //全新分配一個記憶體空間,作用完全等同於以下這行: int* p = (char *) malloc(old_size + new_size);
calloc(len, size)與malloc相似,參數len為申請地址的單位元素長度,size為元素個數,如:
char* p;
p=(char*)calloc(sizeof(char),1000);
對realloc的詳細文法說明:
void *realloc( void *memblock, size_t size );
一、如果memblock = 0, size != 0,表示為空白指標分配空間,同malloc(memblock, size)
二、如果memblock != 0, size = 0,表示將已指派的空間釋放,同free(memblock)
三、如果memblock != 0, size != 0,表示將已指派的空間重新分配,
1。如果size < memblock已指派記憶體大小,則將memblock的後部分切除,返回指標和memblock相等。
2。如果size > memblock已指派記憶體大小,
a)並且memblock大小和其後的自由記憶體總和大於等於size,則分配size大小的記憶體,返回指標和memblock相等。
b)如果memblock大小和其後的自由記憶體總和小於size,則在其他地方分配size大小的記憶體,返回指標和memblock不相等。如果其他地方也沒有足夠空間分配記憶體,則返回指標NULL。
free(p)操作的結果是:指標p指向的地址沒變,但地址處的資料此時已經無定義了。即,指標還在,但是資料已經被釋放了。