天天看點

malloc()和calloc()和 new的功能介紹

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

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