malloc和calloc的區別

2021-06-19 01:40:48 字數 2457 閱讀 7644

函式

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

#include

函式宣告

(函式原型):

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

得到指標,在其它操作上保持一致

malloc 和 calloc 的區別

void calloc size t num elements,size t element size void malloc size t size calloc和malloc都用於分配記憶體。1.malloc函式 malloc函式可以從堆上獲得指定位元組的記憶體空間,其函式宣告如下 void m...

malloc 和calloc 的區別

malloc 和calloc 的區別 1 函式引數 函式malloc 和calloc 都可以用來動態分配記憶體空間,但兩者稍有區別。malloc 函式有乙個引數,即要分配的記憶體空間的大小 void malloc size t size calloc 函式有兩個引數,分別為元素的數目和每個元素的大小...

malloc和calloc的區別

函式malloc 和calloc 都可以用來動態分配記憶體空間,但兩者稍有區別。malloc 函式有乙個引數,即要分配的記憶體空間的大小 void malloc size t size calloc 函式有兩個引數,分別為元素的數目和每個元素的大小,這兩個引數的乘積就是要分配的記憶體空間的大小。vo...