c中malloc的用法

2021-09-18 09:10:35 字數 3750 閱讀 5533

函式宣告(函式原型):

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()函式有乙個引數,即要分配的記憶體空間的大小:

void *malloc(size_t size);

calloc()函式有兩個引數,分別為元素的數目和每個元素的大小,這兩個引數的乘積就是要分配的記憶體空間的大小。

void *calloc(size_t numelements,size_t sizeofelement);

如果呼叫成功,函式malloc()和函式calloc()都將返回所分配的記憶體空間的首位址。

函式malloc()和函式calloc()的主要區別是前者不能初始化所分配的記憶體空間,而後者能。如果由malloc()函式分配的記憶體空間原來沒有 被使用過,則其中的每一位可能都是0;反之,如果這部分記憶體曾經被分配過,則其中可能遺留有各種各樣的資料。也就是說,使用malloc()函式的程式開 始時(記憶體空間還沒有被重新分配)能正常進行,但經過一段時間(記憶體空間還已經被重新分配)可能會出現問題。

函式calloc()會將所分配的記憶體空間中的每一位都初始化為零,也就是說,如果你是為字元型別或整數型別的元素分配記憶體,那麼這些元素將保證會被初始 化為0;如果你是為指標型別的元素分配記憶體,那麼這些元素通常會被初始化為空指標;如果你為實型資料分配記憶體,則這些元素會被初始化為浮點型的零。

需要包含標頭檔案:

#include

或#include

函式宣告(函式原型):

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 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。

原型:extern void *malloc(unsigned int num_bytes);

用法:#include

或#include

功能:分配長度為num_bytes位元組的記憶體塊

說明:如果分配成功則返回指向被分配記憶體的指標,否則返回空指標null。

當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

malloc的語法是:指標名=(資料型別*)malloc(長度),(資料型別*)表示指標.

舉例:// malloc.c

#include

#include

main()

char *p;

clrscr(); // clear screen

p=(char *)malloc(100);

if§printf(「memory allocated at: %x」,p);

else

printf(「not enough memory!\n」);

free§;

getchar();

return 0;

malloc()函式的工作機制

malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足使用者要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊

c中malloc的用法

malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void 型別。void 表示未確定型別的指標。c,c 規定,void 型別可以強制轉換為任何其它型別的指標。原型 extern void malloc unsigned int num bytes 標頭檔案 在tc2.0中可...

malloc函式的用法

malloc函式是一種分配長度為num bytes位元組的記憶體塊的函式,可以向系統申請分配指定size個位元組的記憶體空間。malloc的全稱是memory allocation 動態記憶體分配 當無法知道記憶體具體位置的時候,想要繫結真正的記憶體空間,就需要用到動態的分配記憶體。返回型別是 vo...

malloc 函式的用法

函式宣告 函式原型 void malloc int size 說明 malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void 型別。void 表示未確定型別的指標。c,c 規定,void 型別可以強制轉換為任何其它型別的指標。從函式宣告上可以看出。malloc 和 new ...