1. 程式人生 > >malloc、calloc、realloc之間的區別

malloc、calloc、realloc之間的區別

一,malloc、calloc、realloc

1,malloc

函式原型:

void* malloc(unsigned size);
函式功能:

在堆記憶體中分配一塊長度為size位元組的連續區域,引數size為需要記憶體空間的長度。

2,calloc

函式原型:

void* calloc(size_t numElements, size_t sizeOfElement);  
函式功能:

與malloc相似,引數sizeOfElement為單位元素長度(例如:sizeof(int)),numElements為元素個數,即在記憶體中申請numElements * sizeOfElement位元組大小的連續記憶體空間

3,realloc

函式原型:

void* realloc(void* ptr, unsigned newsize);
函式功能:

使用realloc函式為ptr重新分配大小為size的一塊記憶體空間。下面是這個函式的工作流程:
(1),對ptr進行判斷,如果ptr為NULL,則函式相當於malloc(new_size),試著分配一塊大小為new_size的記憶體,如果成功將地址返回,否則返回NULL。如果ptr不為NULL,則進入(2)。
(2),檢視ptr是不是在堆中,如果不是的話會丟擲realloc invalid pointer異常。如果ptr在堆中,則檢視new_size大小,如果new_size大小為0,則相當於free(ptr),將ptr指向的記憶體空間釋放掉,返回NULL。如果new_size小於原大小,則ptr中的資料可能會丟失,只有new_size大小的資料會儲存;如果size等於原大小,等於什麼都沒有做;如果size大於原大小,則檢視ptr指向的位置還有沒有足夠的連續記憶體空間,如果有的話,分配更多的空間,返回的地址和ptr相同,如果沒有的話,在更大的空間內查詢,如果找到size大小的空間,將舊的內容拷貝到新的記憶體中,把舊的記憶體釋放掉,則返回新地址,否則返回NULL。

二,malloc、calloc、realloc之間的區別

1,是否會對申請的記憶體空間進行初始化

函式malloc不能初始化所分配的記憶體空間,函式calloc() 會將所分配的記憶體空間中的每一位都初始化為零

2,功能上的區別

malloc與calloc用來動態分配記憶體空間,而realloc則是對給定的指標所指向的記憶體空間進行擴大或者縮小。