malloc 和 calloc 的區別

2021-06-06 05:17:06 字數 4177 閱讀 7624

void *calloc(size_t num_elements,size_t element_size);

void *malloc(size_t size);

calloc和malloc都用於分配記憶體。

1.   malloc函式

malloc函式可以從堆上獲得指定位元組的記憶體空間,其函式宣告如下:

void * malloc(int n);

其中,形參n為要求分配的位元組數。如果函式執行成功,malloc返回獲得記憶體空間的首位址;如果函式執行失敗,那麼返回值為null。由於malloc函式值的型別為void型指標,因此,可以將其值型別轉換後賦給任意型別指標,這樣就可以通過操作該型別指標來操作從堆上獲得的記憶體空間。

需要注意的是,malloc函式分配得到的記憶體空間是未初始化的。因此,一般在使用該記憶體空間時,要呼叫另乙個函式memset來將其初始化為全0。memset函式的宣告如下:

void * memset (void * p,int c,int n) ;

該函式可以將指定的記憶體空間按位元組單位置為指定的字元c。其中,p為要清零的記憶體空間的首位址,c為要設定的值,n為被操作的記憶體空間的位元組長度。如果要用memset清0,變數c實參要為0。malloc函式和memset函式的操作語句一般如下:

int * p=null;

p=(int *)malloc(sizeof(int));

if(p==null)

printf(「can』t get memory!\n」);

memset(p,0,siezeof(int));

注意:通過malloc函式得到的堆記憶體必須使用memset函式來初始化。

demo:

#include

#include

#include

int main()

int * p=null;

p=(int *)malloc(sizeof(int));

if(null==p){

printf("can't get memory!\n");

return -1;

printf("%d\n",*p);           //輸出分配的空間上的值

memset(p,0,sizeof(int));     //將p指向的空間清0

printf("%d\n",*p);           //輸出呼叫memset函式後的結果

*p=2;

printf("%d\n",*p);

return 0;

2. calloc函式

calloc函式的功能與malloc函式的功能相似,都是從堆分配記憶體。其函式宣告如下:

void *calloc(int n,int size);

函式返回值為void型指標。如果執行成功,函式從堆上獲得size x n的位元組空間,並返回該空間的首位址。如果執行失敗,函式返回null。該函式與malloc函式的乙個顯著不同時是,calloc函式得到的記憶體空間是經過初始化的,其內容全為0。calloc函式適合為陣列申請空間,可以將size設定為陣列元素的空間長度,將n設定為陣列的容量。

demo:

#include

#include

#define size 5

int main()

int * p=null;

int i=0;

//為p從堆上分配size個int型空間

p=(int *)calloc(size,sizeof(int));

if(null==p){

printf("error in calloc.\n");

return -1;

//為p指向的size個int型空間賦值

for(i=0;ip[i]=i;

//輸出各個空間的值

for(i=0;iprintf("p[%d]=%d\n",i,p[i]);

free(p);

p=null;

return 0;

函式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;如果你是為指標型別的元

素分配記憶體,那麼這些元素通常會被初始化為空

指標;如果你為實型資料分配記憶體,

則這些元素

會被初始化為浮點型的零。

函式宣告(函式原型):

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的區別

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

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...