malloc和calloc學習

函數

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章