c系統的函式庫中提供了了程式動態申請和釋放記憶體儲存塊的庫函式,下面將分別介紹。
1、malloc 函式
a、該函式的原型:void *malloc(size_t size);
b、該函式只有乙個引數,且形參size是無符號整型,該引數代表申請空間的位元組數。
c、返回值:如果記憶體池中的可用記憶體滿足需求,malloc返回乙個指向被分配記憶體塊起始位置的指標;如果記憶體池中的可用記憶體不能滿足需求,則返回乙個null指標。
d、malloc所分配的是一塊連續的記憶體。
注:malloc實際分配的記憶體有可能比你的請求稍微多一點,但這個行為是由編譯器定義的。
malloc申請記憶體空間時,有可能記憶體池時空的或它的可用記憶體無法滿足你的需求,在這種情況下,malloc函式會向作業系統請求,要求得到更多的記憶體,並在這塊新記憶體上執行分配任務;如果作業系統無法向malloc提供更多的記憶體,malloc會返回null指標。
malloc函式申請到的這塊記憶體並沒有以任何方式進行初始化。如果對這塊記憶體初始化非常重要,那就要自己手動進行初始化。
eg: 用malloc開闢乙個長度為6的記憶體空間:malloc(6),如果系統分配的此段空間的起始位址為78243,則malloc(6)的函式返回值為78243.
如果想把以上位址賦給乙個指向long型的指標變數p,則應進行以下顯式轉換(輕質型別轉換):
p=(long*)malloc(6).
2、calloc 函式
a、該函式的原型:void *calloc(size_t num_elements,size_t element_size);
b、該函式有兩個引數,第乙個引數表示申請元素的個數,第二個引數表示元素型別所佔的位元組數。
c、返回值:同malloc函式。
注: calloc返回指向記憶體的指標之前就把它初始化為0。這個初始化很方便,但是如果程式只是想把一些值儲存到陣列中,那麼這個過程就很浪費時間。
eg:可用calloc(20,15)開闢20個(每個大小為15位元組)的空間,總長為300位元組。
3、realloc 函式
a、該函式的原型:void * realloc(void *ptr,size_t new_size)
b、該函式有兩個引數,第乙個引數表示指標,第二個引數表示調整(申請)空間的位元組數。
c、返回值:同malloc函式。(還是有一點點區別,具體見「注」)
d、該函式用於修改乙個原先已經分配的記憶體塊的大小。
注:如果該函式用於擴大乙個記憶體塊,那麼這塊記憶體原先的內容依然保留,新增加的記憶體新增到原先記憶體塊的後面,新記憶體並未以任何方式進行初始化。
如果該函式用於縮小乙個記憶體塊,該記憶體塊尾部的部分記憶體便被拿掉,剩餘部分記憶體的原先內容依然保留。
如果原先的記憶體塊無法改變大小,realloc將分配另一塊正確大小的記憶體,並把原先那塊記憶體的內容複製到新的塊上。因此,使用realloc後,就不能使用舊記憶體的指標,而應該改用realloc所返回的新指標。
4、free 函式
a、該函式的原型:void free(void *pointer)
b、該函式的引數要麼是null,要麼是先前從malloc、calloc或realloc返回的值。
c、該函式無返回值。
d、作用:釋放malloc、(或calloc、realloc)函式給指標變數分配的記憶體空間的函式。
注:該函式使用後該指標變數一定要重新指向null,防止野指標出現,有效規避誤操作。
該函式的引數pointer的值不能是任意的位址項,只能是由malloc、(或calloc、realloc)函式返回的位址。
C語言動態記憶體管理
1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...
C語言動態記憶體管理
在說明c語言記憶體管理之前,要知道什麼是記憶體,記憶體我個人認為可以理解為帶有標籤的盒子,所謂的帶標籤的盒子就像我們住的寢室一樣有門牌號,盒子內只能儲存固定型別的資料或變數,就如男生寢室只能住男生一樣。那麼c語言中有多少種盒子呢?有靜態儲存區 動態儲存區 內部暫存器區域。我們通常定義的變數如果沒有特...
C 語言動態記憶體管理
int a 10 在棧空間開闢了4個位元組 int arr 10 在棧空間連續開闢了10個連續的4位元組空間 上面的兩行 開闢空間的方式均是開闢了大小固定的空間。但是我們實際對空間的需求,不僅僅是上訴的情況。而是隨著程式執行的時候我們才知道我們需要的空間要多大,那陣列的編譯時開闢空間的方式就不能買滿...