malloc用法

malloc用法

需要包含頭文件:

#include 'stdlib.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 [] 的效果,申請出一段連續的內存,方法無非是指定你所需要內存大小。比如想分配100int類型的空間:

int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數的內存空間。

 

另外有一點不能直接看出的區別是,malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。

除了分配及最後釋放的方法不一樣以外,通過mallocnew得到指針,在其它操作上保持一致。

free用法

需要包含頭文件( malloc 一樣)

#include 'stdlib.h'

函數聲明:

void free(void *block);

即: void free(指針變量)

 

之所以把形參中的指針聲明爲 void* ,是因爲free必須可以釋放任意類型的指針,而任意類型的指針都可以轉換爲void *

 

舉例:

 

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

 

*p = 100;

 

free(p); //釋放 p 所指的內存空間

 

或者:

 

int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數的內存空間。

 

……

 

free(p);

 

free 不管你的指針指向多大的空間,均可以正確地進行釋放,這一點釋放比 delete/delete [] 要方便。不過,必須注意,如果你在分配指針時,用的是newnew[],那麼抱歉,當你在釋放內存時,你並不能圖方便而使用free來釋放。反過來,你用malloc 分配的內存,也不能用delete/delete[] 來釋放。一句話,new/deletenew[]/delete[]malloc/free 三對均需配套使用,不可混用!

int* p = new int[100];

free(p);      //ERROR! p 是由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;如果你是爲指針類型的元素分配內存,那麼這些元素通常會被初始化爲空指針;如果你爲實型數據分配內存,則這些元素會被初始化爲浮點型的零。 


需要包含頭文件: 
i nclude <mallco.h>
 
i nclude <stdlib.h>

 

發佈了7 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章