1. 程式人生 > >C語言記憶體分配calloc,malloc,alloc,realloc的區別

C語言記憶體分配calloc,malloc,alloc,realloc的區別



 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函式是從棧上分配記憶體,無需釋放。