C記憶體管理函式

2021-04-12 17:26:26 字數 2160 閱讀 8840

在c裡,記憶體管理是通過專門的函式來實現。另外,為了相容各種程式語言,作業系統提供的介面通常是 c 語言寫成的函式宣告 (windows 本身也由c和組合語言寫成)。

1分配記憶體 malloc函式

需要包含標頭檔案:

#include 或#include

函式宣告(函式原型):

void *malloc(int size);

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

從函式宣告上可以看出。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 的效果,申請出一段連續的記憶體,方法無非是指定你所需要記憶體大小。

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

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

另外有一點不能直接看出的區別是,malloc 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。

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

2放記憶體free函式

需要包含標頭檔案(和 malloc 一樣):

#include

或#include

函式宣告:

void free(void *block);

即: void free(指標變數);

之所以把形參中的指標宣告為 void* ,是因為free必須可以釋放任意型別的指標,而任意型別的指標都可以轉換為void *。

舉例:int* p = (int *) malloc(4); 

*p = 100;

free(p); //釋放 p 所指的記憶體空間

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

……free(p);

free 不管你的指標指向多大的空間,均可以正確地進行釋放,這一點釋放比 delete/delete 要方便。不過,必須注意,如果你在分配指標時,用的是new或new,那麼抱歉,當你在釋放記憶體時,你並不能圖方便而使用free來釋放。反過來,你用malloc 分配的記憶體,也不能用delete/delete 來釋放。一句話,new/delete、new/delete、malloc/free 三對均需配套使用,不可混用!

int* p = new int[100];

... ...

free(p);  //error! p 是由new 所得。

C 記憶體管理函式

建立乙個file 指標,連線到檔案上函式原型 file fopen const char path const char mode 引數 filename 指定絕對路徑或者相對路徑的檔名mode 分別指定 r 當檔案存在返回有效的檔案指標,當檔案不存在返回空指標 w 如果檔案不存在,建立檔案,如果檔...

記憶體管理函式

一 基本用法 include int brk void addr void sbrk intptr t increment 返回空間位址brk是系統呼叫,通過傳遞的addr來重新設定program break,成功返回0,否則返回 1。sbrk不是系統呼叫,是c庫函式,用來增加heap,增加的大小通...

C 記憶體管理 C 記憶體分類

c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...