C語言記憶體分配calloc,malloc,alloc,realloc的區別
阿新 • • 發佈:2019-01-06
void *malloc(size_t size);malloc函式為長度size的物件分配記憶體,並返回指向分配區域的指標;若無法滿足要求,則返回NULL。該函式不對分配的記憶體區域進行初始化。
void *calloc(size_t nobj, size_t size);calloc函式為由nobj個長度為size的物件組成的陣列分配記憶體,並返回指向分配區域的指標;若無法滿足要求,則返回NULL。分配 成功後 ,空間初始化為0,
void *realloc(void *p, size_t size);realloc函式將p指向的物件的長度修改為size個位元組。如果新分配的記憶體比原來記憶體大,則原記憶體的內容會拷貝到新的記憶體空間,新增加的空間不進行初始化。如果新分配的記憶體比原來的記憶體小,則分配記憶體單元不初始化,realloc函式返回指向新分配空間的指標,原有的記憶體的空間會被釋放;若無法滿足要求,則返回NULL。在這種情況下,原來指標p指向的單元內容保持不變。一定要注意,如果呼叫成功後,原有的記憶體空間和指標p 都失效了。虛擬碼如下:
void* realloc(void *p,int nSize)
{
void *pTemp = malloc(nSize);
if(pTemp == NULL)
return NULL;
else
{
//OS 知道原來空間的大小,假定為xxx
if(nSize>=xxx)
memcpy(pTemp,p,xxx);
free(p);
}
return pTemp;
}
以上三個函式都在都在stdlib.h函式庫內 。
alloc函式是從棧上分配記憶體,無需釋放。