malloc函式詳解

Roninwz發表於2017-10-10

一、原型: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("MemoryAllocated at: %x/n",p);
      else
           printf("NotEnough Memory!/n");
      free(p);
      return0;
}

 

 

二、函式宣告(函式原型)

void *malloc(int size);

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

     

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

三、mallocnew的不同點

  從函式宣告上可以看出。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得到指標,在其它操作上保持一致。

 

 總結:

malloc()函式其實就在記憶體中找一片指定大小的空間,然後將這個空間的首地址範圍給一個指標變數,這裡的指標變數可以是一個單獨的指標,也可以是一個陣列的首地址,這要看malloc()函式中引數size的具體內容。我們這裡malloc分配的記憶體空間在邏輯上連續的,而在物理上可以連續也可以不連續。對於我們程式設計師來說,我們關注的是邏輯上的連續,因為作業系統會幫我們安排記憶體分配,所以我們使用起來就可以當做是連續的。


轉載來自:http://m.blog.csdn.net/xw13106209/article/details/4962479

 

相關文章