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等其他數字通常代表異常終止。可通過返回的具體數值判斷出錯源