天天看點

malloc函數詳解 (與new對比)

malloc的全稱是memory allocation,中文叫動态記憶體配置設定,當無法知道記憶體具體位置的時候,想要綁定真正的記憶體空間,就需要用到動态的配置設定記憶體。

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

頭檔案:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 與 malloc.h 的内容是完全一緻的。)

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

說明:如果配置設定成功則傳回指向被配置設定記憶體的指針,否則傳回空指針NULL。

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

舉例:

[c-sharp] view plain copy

  1. #include<stdio.h>  
  2. #include<malloc.h>  
  3. int main()  
  4. {  
  5.     char *p;  
  6.     p=(char *)malloc(100);  
  7.     if(p)  
  8.         printf("Memory Allocated at: %x/n",p);  
  9.     else  
  10.         printf("Not Enough Memory!/n");  
  11.     free(p);  
  12.     return 0;  
  13. }  

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

  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配置設定的記憶體空間在邏輯上連續的,而在實體上可以連續也 可以不連續。對于我們程式員來說,我們關注的是邏輯上的連續,因為作業系統會幫我們安排記憶體配置設定,是以我們使用起來就可以當做是連續的。