關於malloc函式的用法

2021-07-29 17:49:20 字數 1926 閱讀 2762

一,函式宣告

malloc 向系統申請分配指定size個位元組的記憶體空間。

返回型別是 void* 型別。void* 表示未確定型別的指標。

c,c++規定,void* 型別可以通過型別轉換強制轉換為任何其它型別的指標

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

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

1.記憶體分配

例如

char *p = (char *)malloc(100);

在堆上分配了100個位元組記憶體,返回這塊記憶體的首位址,把位址強制轉換成char *型別後賦給char *型別的指標變數p。同時告訴我們這塊記憶體將用來儲存char型別的資料。也就是說你只能通過指標變數p來操作這塊記憶體。這塊記憶體本身並沒有名字,對它的訪問是匿名訪問

但是不一定每次都能分配成功

函式同樣要注意這點:如果所申請的記憶體塊大於目前堆上剩餘記憶體塊(整塊),則記憶體分配會失敗,函式返回null。注意這裡說的「堆上剩餘記憶體塊」不是所有剩餘記憶體塊之和,因為malloc函式申請的是連續的一塊記憶體。既然malloc函式申請記憶體有不成功的可能,那我們在使用指向這塊記憶體的指標時,必須用if(null!=p)語句來驗證記憶體確實分配成功了。

2.記憶體釋放

既然有分配,那就必須有釋放。不然的話,有限的記憶體總會用光,而沒有釋放的記憶體卻在空閒。與malloc對應的就是free函式了。free函式只有乙個引數,就是所要釋放的記憶體塊的首位址。

free(p);

而free函式的作用是斬斷指標變數與這塊記憶體的關係。

malloc兩次只free一次會記憶體洩漏;malloc一次free兩次肯定會出錯。也就是說,在程式中malloc的使用次數一定要和free相等,否則必有錯誤。這種錯誤主要發生在迴圈使用malloc函式時,往往把malloc和free次數弄錯了。

二,malloc和new的區別

1.new返回指定型別的指標並且可以自動計算所需大小

比如:   

1)

int *p; 

p = new int;   //返回型別為int *型別,分配的大小為sizeof(int)

p = new int[100];    //返回型別為int *型別,分配的大小為sizeof(int) * 100

2)而 malloc 則必須要由我們計算位元組數,並且在返回後強行轉換為實際型別的指標。   

int* p;   

p = (int *) malloc (sizeof(int)*128);//分配128個(可根據實際需要替換該數值)整型儲存單元,並將這128個連續的整型儲存單元的首位址儲存到指標變數p中

double *pd=(double *) malloc (sizeof(double)*12);//分配12個double型儲存單元,並將首位址儲存到指標變數pd中

2.malloc只管分配記憶體,並不能對所得記憶體初始化,所以得到新的記憶體其值是隨機的 

除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指標,在其它操作上保持一致。

總結:malloc和free是c/c++中的標準庫函式,new和delete是c++的運算子。對於非內建資料型別的物件而言,光用maloc/free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式, 物件消亡之前要自動執行析構函式。由於malloc/free 是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加malloc/free

malloc函式的用法

malloc函式是一種分配長度為num bytes位元組的記憶體塊的函式,可以向系統申請分配指定size個位元組的記憶體空間。malloc的全稱是memory allocation 動態記憶體分配 當無法知道記憶體具體位置的時候,想要繫結真正的記憶體空間,就需要用到動態的分配記憶體。返回型別是 vo...

malloc 函式的用法

函式宣告 函式原型 void malloc int size 說明 malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void 型別。void 表示未確定型別的指標。c,c 規定,void 型別可以強制轉換為任何其它型別的指標。從函式宣告上可以看出。malloc 和 new ...

malloc函式的用法

malloc 是記憶體分配 分配的空間以位元組為單位 sizeof int n 1 是求乙個位元組數的過程 sizeof int 就是int型別的位元組數,再 n 1 其實就是連續的n 1個int型數的空間所含的位元組數 前面二者合起來就是分配了大小為n 1個int型的空間所含的位元組數 此時 in...