1. 程式人生 > >malloc、calloc、realloc的使用和區別

malloc、calloc、realloc的使用和區別

一、malloc
1.函式原型
void *malloc(size_t size); 
2.函式功能

malloc()在記憶體的動態儲存區中分配一塊長度為size位元組的連續區域。引數size為需要的記憶體空間的長度,返回該區域的地址。

3.區別

malloc不能初始化所分配的記憶體空間,需要用memset而函式calloc能。如果這部分記憶體曾經被分配過,則其中可能遺留各種各樣的資料。 

二、calloc
1.函式原型
void *calloc(size_t nmemb, size_t size); 
2.函式功能

calloc()與malloc()相似,引數size為申請地址的單位元素長度,nmemb為引數個數。

3.區別

calloc會將所分配的空間中的每一位都初始化為零。

三、realloc
1.函式原型
void *realloc(void *ptr, size_t size);
2.函式功能
realloc()是給一個已經分配了地址的指標重新分配空間,引數ptr為原有的空間地址,newsize是重新申請的地址空間。3.區別

realloc可以對給定的指標所指向的空間進行擴大或縮小,原有的記憶體中的內容將保持不變。realloc並不保持調整後的記憶體空間和原來的記憶體空間保持同一記憶體地址,返回的指標很可能指向新的地址。

四、實現原理

  malloc、calloc函式的實質體現在將一塊可用的記憶體連線為一個連結串列。呼叫malloc函式時,它沿連線表尋找一個大到足以滿足使用者請求所需要的記憶體塊,然後將該記憶體塊一分為二(一塊與使用者申請的大小一樣,另一塊就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體地址傳給使用者,呼叫free函式時,它將使用者釋放的記憶體塊連線到空鏈上,最後空閒連結串列會被切成很多的小記憶體片段。
  realloc是從堆空間上分配記憶體,當擴大一塊記憶體空間時,realloc試圖直接從現存的資料後面的哪些位元組中獲得附加的位元組,如果能夠滿足需求,自然天下太平,如果後面的位元組不夠,那麼就使用堆上第一個足夠滿足要求的自由空間塊,現存的資料然後就被拷貝到新的位置上,而老塊則放回堆空間,這句話傳遞的一個很重要的資訊就是資料可能被移動。