函數 malloc() 和 calloc() 都可以用來動態分配內存空間 , 但兩者稍有區別。
malloc() 函數有一個參數 , 即要分配的內存空間的大小 :
void *malloc(size_t size);
calloc() 函數有兩個參數 , 分別爲元素的數目和每個元素的大小 , 這兩個參數的乘積就是要分配的內存空間的大小。
void *calloc(size_t numElements,size_t sizeOfElement);
如果調用成功 , 函數 malloc() 和函數 calloc() 都將返回所分配的內存空間的首地址。
函數 malloc() 和函數 calloc() 的主要區別是前者不能初始化所分配的內存空間 , 而後者能。
如果由 malloc() 函數分配的內存空間原來沒有被使用過,則其中的每一位可能都是 0; 反之 , 如果這部分內存曾經被分配過 , 則其中可能遺留有各種各樣的數據。也就是說,使用 malloc() 函數的程序開始時 ( 內存空間還沒有被重新分配 ) 能正常進行 , 但經過一段時間 ( 內存空間還已經被重新分配 ) 可能會出現問題。
函數 calloc() 會將所分配的內存空間中的每一位都初始化爲零 , 也就是說 , 如果你是爲字符類型或整數類型的元素分配內存 , 那麼這些元素將保證會被初始化爲 0; 如果你是爲指針類型的元素分配內存 , 那麼這些元素通常會被初始化爲空指針 ; 如果你爲實型數據分配內存 , 則這些元素會被初始化爲浮點型的零。
需要包含頭文件:
#include <syslib.h> # i nclude<malloc.h>
函數聲明 ( 函數原型 ) : void *malloc(int size);
說明: malloc 向系統申請分配指定 size 個字節的內存空間。返回類型是 void* 類型。 void* 表示未確定類型的指針。 C,C++ 規定, void* 類型可以強制轉換爲任何其它類型的指針。從函數聲明上可以看出。 malloc 和 new 至少有兩個不同 : new 返回指定類型的指針,並且可以自動計算所需要大小。比如:
int *p;
p = new int; // 返回類型爲 int* 類型 ( 整數型指針 ) ,分配大小爲 sizeof(int);
或:
int* parr;
parr = new int [100]; // 返回類型爲 int* 類型 ( 整數型指針 ) ,分配大小爲 sizeof(int) * 100;
而 malloc 則必須由我們計算要字節數,並且在返回後強行轉換爲實際類型的指針。
int* p;
p = (int *) malloc (sizeof(int));
第一、 malloc 函數返回的是 void * 類型,如果你寫成: p = malloc (sizeof(int)); 則程序無法通過編譯,報錯: “ 不能將 void* 賦值給 int * 類型變量 ” 。所以必須通過 (int *) 來將強制轉換。
第二、函數的實參爲 sizeof(int) ,用於指明一個整型數據需要的大小。如果你寫成:
int* p = (int *) malloc (1);
代碼也能通過編譯,但事實上只分配了 1 個字節大小的內存空間,當你往裏頭存入一個整數,就會有 3 個字節無家可歸,而直接 “ 住進鄰居家 ” !造成的結果是後面的內存中原有數據內容
全部被清空。
malloc 也可以達到 new [] 的效果,申請出一段連續的內存,方法無非是指定你所需要內存大小。
比如想分配 100 個 int 類型的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); // 分配可以放得下 100 個整數的內存空間。
另外有一點不能直接看出的區別是, malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
除了分配及最後釋放的方法不一樣以外,通過 malloc 或 new 得到指針,在其它操作上保持一致