1. 程式人生 > >C語言學習筆記---malloc函式詳解

C語言學習筆記---malloc函式詳解

                                                                                            malloc函式詳解

一、malloc函式標頭檔案:

#include<stdlib.h> 或者 #include<malloc.h>

二、原型:extern void * malloc(unsigned int num_byte)

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

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

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

簡單舉例:

#include<stdio.h>

#include<stdlib.h>

int main()

{

char *p;

p=NULL;

    p = (char *)malloc(100);

    if(p != NULL) // 如果記憶體分配成功

    {

printf("memory allocated at:%x\n",p);

         }

    else

{

printf("not enough memory!\n");

}

free(p);

p=NULL;

    return 0;

}

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

void * malloc(int size);

說明:malloc向系統申請分配指定size個位元組的記憶體空間。返回型別是void *型別。void *型別表示未確定型別的指標。C、C++規定,void *型別可以強制轉換為任何其他型別的指標。

 例如:

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個位元組無家可歸,而直接“住進領居家”!造成的後果是後面的記憶體中原有資料內用全部被清空。

比如你想分配100個int型別的空間:

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

四、malloc函式程式示例:

typedef struct data_type

{

    int age;

    char name[20];

}data;

data*bob=NULL;               //定義一個指標,指向NULL

bob=(data*)malloc(sizeof(data));  //記憶體分配

if(bob!=NULL)                 //檢測記憶體是否分配成功

{

    bob->age=22;

    strcpy(bob->name,"Robert");

    printf("%sis%dyearsold\n",bob->name,bob->age);

}

else

{

    printf("mallocerror!\n");

    exit(-1);

}

free(bob);                 //釋放記憶體

bob=NULL;                //記憶體指向NULL

總結、函式使用的注意事項:

A、申請了記憶體空間後,必須檢查是否分配成功。

B、當不需要再使用申請的記憶體時,記得釋放;釋放後應該把指向這塊記憶體的指標指向NULL,防止程式後面不小心使用了它。

C、記憶體分配和記憶體釋放這兩個函式應該是配對。如果申請後不釋放就是記憶體洩露;如果無故釋放那就是什麼也沒有做。釋放只能一次,如果釋放兩次及兩次以上會出現錯誤(釋放空指標例外,釋放空指標其實也等於啥也沒做,所以釋放空指標釋放多少次都沒有問題)。

D、雖然malloc()函式的型別是(void *),任何型別的指標都可以轉換成(void *),但是最好還是在前面進行強制型別轉換,因為這樣可以躲過一些編譯器的檢查。

E、malloc只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的

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

G、exit(1):退出整個程式,終止程序,並返回1給作業系統。

由於返回0代表程式正常退出,返回1等其他數字通常代表異常終止。可通過返回的具體數值判斷出錯源