malloc函數詳解

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

頭文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 與 malloc.h 的內容是完全一致的。)

功能:分配長度爲num_bytes字節的內存塊

說明:如果分配成功則返回指向被分配內存的指針,否則返回空指針NULL。

當內存不再使用時,應使用free()函數將內存塊釋放。

 

舉例:

#include<stdio.h>
#include<malloc.h>
int main()
{
	char *p;
 
	p=(char *)malloc(100);
	if(p)
		printf("Memory Allocated at: %x/n",p);
	else
		printf("Not Enough Memory!/n");
	free(p);
	return 0;
}



二、函數聲明(函數原型):

  void *malloc(int size);

  說明:malloc 向系統申請分配指定size個字節的內存空間。返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規定,void* 類型可以強制轉換爲任何其它類型的指針。這個在MSDN上可以找到相關的解釋,具體內容如下:

     

malloc returns a void pointer to the allocated space, or NULL if there is insufficient memory available. To return a pointer to a type other than void, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0, malloc allocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return from malloc, even if the amount of memory requested is small.

三、malloc與new的不同點

  從函數聲明上可以看出。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()函數其實就在內存中找一片指定大小的空間,然後將這個空間的首地址範圍給一個指針變量,這裏的指針變量可以是一個單獨的指針,也可以是一個數組的首地址,這要看malloc()函數中參數size的具體內容。我們這裏malloc分配的內存空間在邏輯上連續的,而在物理上可以連續也可以不連續。對於我們程序員來說,我們關注的是邏輯上的連續,因爲操作系統會幫我們安排內存分配,所以我們使用起來就可以當做是連續的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章