數
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
得到指針,在其它操作上保持一緻