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