(void *)malloc(int size)
malloc函式的返回值是乙個void型別的指標,引數為int型別的資料,即申請分配的記憶體大小,單位是位元組。記憶體分配成功之後,malloc函式返回這塊記憶體的首位址,你需要乙個指標來接受這個位址。但是由於函式的返回值是void *型別,所以必須強制轉換成你所接收的型別。也就是說這塊記憶體將來要用來儲存什麼型別的資料,
比如 char *p = (char *)malloc(100);
在堆上分配了100個位元組的記憶體,返回這塊記憶體的首位址,把位址強制轉換成char *型別後,賦給char *型別的指標變數p;同時告訴我們這塊記憶體將用來儲存char型別的資料。也就是說你只能通過指標變數p來操作這塊記憶體。
使用malloc函式同樣要注意這點:如果所申請的記憶體塊大於目前堆上剩餘的記憶體塊(整塊),則記憶體分配就會失敗,函式函式null。注意這裡說的是「堆上剩餘記憶體塊」不是所有剩餘記憶體塊之和,因為malloc函式申請的是連續的一塊記憶體。既然malloc函式申請記憶體又不成功的可能,那我們在使用指向這塊記憶體的指標時,必須用if( null != p)語句上來驗證記憶體分配確實成功了。
在c語言程式設計中,記憶體洩漏幾乎是很難避免的,c程式產生洩漏記憶體,則執行速度會逐漸變慢,並最終停止執行;如果產生覆蓋記憶體,程式會變得非常脆弱,很容易受到惡意使用者的攻擊。記憶體洩漏是一種隱性危害,它們很難被發現,通常不能在相應的源**中找到錯誤,需要仔細分析與專門的檢測工具才能發現。
(1)記憶體洩漏的定義
通常我們所說的記憶體洩漏,是指分配出去的內存在使用之後沒有釋放掉,沒有**,長此以往,會造成沒有足夠的記憶體可以分配。一般表現為執行時間越長,占用的記憶體越多,最終導致系統奔潰。一般的記憶體洩漏是指堆記憶體的洩漏。堆記憶體是指程式從堆中分配的,大小任意的(記憶體塊的大小可以在程式執行期決定),使用完後必須顯式釋放的記憶體。應用程式一般使用malloc,realloc,new等函式從堆中分配到一塊記憶體,使用完後,程式必須負責相應的呼叫free或delete釋放該記憶體塊,否則,這塊記憶體就不能被再次使用,我們就說這塊記憶體洩漏了。
2.1 c語言記憶體分配情況
在c語言中,根據資料在記憶體中存在的時間(生存週期)不同,將記憶體空間分為三個區:
1)程式區:用於儲存程式的**,即程式的二進位制**。
2)靜態儲存區:用於儲存全域性變數和靜態變數,這些變數的空間在程式編譯時就已經分配好了。
3)動態儲存區:用於在程式執行時分配的記憶體,又分為:堆區(heap)和棧區(stack)。堆區:用於動態記憶體 分配,程式執行時由記憶體分配函式在堆上分配記憶體。在c語言中,只能使用指標才能動態的分配記憶體。棧區:在 函式執行時,函式內部的區域性變數和函式引數的儲存單元的記憶體區域,函式執行結束時,這些記憶體區域會自動釋 放。
2.2 c語言動態記憶體分配
在c語言中用記憶體分配函式來實現記憶體的動態分配,這些函式有:malloc()和realloc()等函式。malloc():使用這個 函式時需要包含標頭檔案。使用該函式需要指定要分配的記憶體位元組數作為引數,例如:
int *pnumber=(int *) malloc(100)
這條語句分配了100個位元組的記憶體,並把這個記憶體塊的位址賦給pnumber,這個記憶體塊可以儲存最大25個int值, 每個int佔4個位元組。如果不能分配請求的記憶體,malloc()會返回乙個null指標。
2.3 釋放動態分配的記憶體
堆上分配的記憶體會在整個應用程式結束之後,由作業系統負責**,但最好是在使用完這些記憶體後立即釋放。如 果不釋放,會引起記憶體洩漏,極大占用系統資源,可能會產生各種未知的錯誤。所以,必須使用free()函式釋 放記憶體,引數是記憶體位址(指標),例如:free(pnumber),依上例。
(3)記憶體洩漏避免的方法
3.1正確使用malloc函式分配記憶體
malloc是乙個函式,專門用來從堆上分配記憶體。使用malloc函式需要幾個要求:記憶體分配給誰?分配多大記憶體? 是否還有足夠記憶體分配? 記憶體將用來儲存什麼格式的資料?分配好的內存在**? 如果這5點都確定,那記憶體就 能分配。下面看看malloc的原型:(void *)malloc(int size)
malloc函式的返回值是乙個void型別的指標,引數為int型別的資料,即申請分配的記憶體大小,單位是位元組。記憶體 分配成功之後,malloc函式返回這塊記憶體的首位址,你需要乙個指標來接受這個位址。也就是說這塊記憶體將來要 用來儲存什麼型別的資料,如:
char *p = (char *)malloc(100)
在堆記憶體分配了100個位元組的記憶體,返回這塊記憶體的首位址,把位址強制轉換成char *型別後賦給char *型別的指 針變數p;同時告訴我們這塊記憶體將用來儲存char型別的資料。你只能通過指標變數p來操作這塊記憶體,這塊記憶體 本身沒有名字,對它的訪問是匿名訪問。但是,不一定每次malloc函式都能成功分配到記憶體。既然malloc函式申 請記憶體存在不成功的可能,那我們在使用指向這塊記憶體的指標時,必須用if( null != p)語句上來驗證記憶體分 配確實成功了。
3.2 正確使用free函式釋放記憶體
既然有分配,那就必須有釋放,不然的話,有限的記憶體就會用光,而沒有釋放的記憶體卻占用空間,與malloc對應 的就是free函式了。free函式只有乙個引數,就是所要釋放的記憶體塊的首位址(指標)。按上例,則 為:free(p).free函式其實它就做了一件事:斬斷指標變數和這塊記憶體的對應關係。free函式就是把這塊記憶體和p 之間的關係斬斷;p本身的值並沒有改變或者消失,即指標變數p本身儲存的位址並沒有改變,那塊被釋放的記憶體 裡面儲存的值也沒有改變。這就是free函式的功能,乙個malloc對應乙個free,是一夫一妻制。在使用free(p) 函式記憶體釋放後,指標變數p本身儲存的位址並沒有改變,那我們必須需重新把p的值變為null:p = null。如 果沒有把該指標置null,這個指標就成為了「懸空指標」,這是很危險的,且也是經常出錯的地方。
參考:
C語言malloc函式
malloc 標頭檔案 include 原型 void malloc size t size 引數說明 size為需要分配的記憶體空間大小,單位是byte 函式說明 在堆區分配一塊size byte大小的記憶體空間,用於存放資料,這塊記憶體空間被分配後不會被初始化,因此這些記憶體空間對應的值是未知的...
c語言 malloc函式的簡介
用於解決傳統陣列以下缺點。傳統陣列的長度必須要事先指定。傳統陣列的記憶體無法手動釋放。傳統陣列的長度定義後無法更改 無法跨函式使用 例 include incldue int main void 標頭檔案需要新增malloc.h malloc函式需要乙個且僅需要乙個整形形參 形參表示為本程式分配4個...
C語言之malloc函式
from msdn 百科 原型 void malloc unsigned int size include或 include malloc的全稱是memory allocation,中文叫動態記憶體 分配,當無法知道記憶體具體位置的時候,想要繫結真正的記憶體空間,就需要用到動態的分配記憶體。mall...