c語言支援動态存儲配置設定,即在程式執行期間配置設定記憶體單元的能力,利用動态存儲配置設定,可以根據需要設計擴大(或縮小)的資料結構,雖然可以适用于所有類型的資料,但是動态存儲配置設定更常用于字元串、數組和結構體
3種記憶體配置設定函數都是聲明在<stdlib.h>中:
malloc函數--配置設定記憶體塊,但是不對記憶體塊進行初始化
calloc函數--配置設定記憶體塊,并且對記憶體塊進行消除
realloc函數--調整先前配置設定的記憶體塊
malloc函數不需要對配置設定的記憶體快進行清除,是以它比calloc函數更高效
當申請記憶體塊而調用記憶體配置設定函數的時候,函數會傳回void*型的值。記憶體中對象的空間大小,是以“位元組”的數目為機關計算的,許多頭檔案都定義了size_t類型,專門用來儲存這種“記憶體”空間的相關資訊,比如sizeof運算符傳回位元組的數目,類型是size_t
由于用名null的宏來表示空指針,是以常使用下列方式測試malloc函數的傳回值:
在c語言中,指針測試真假的方法和數的測試一樣:
舉例如下:
使用malloc函數為數組配置設定存儲空間,需要使用sizeof運算符來計算每個元素所需要的空間數量
calloc函數
calloc函數在<stdlib.h>中具有如下的原型:
void *calloc(size_t nmemb, size_t size);
在配置設定了記憶體之後,calloc函數會通過對所有位設定為0的方式進行初始化
realloc函數
realloc函數可以調整數組的大小使它更适合需要,realloc函數原型在<stdlib.h>中:
void *realloc(void *ptr, size_t size)
ptr指向的記憶體塊一定是先前通過malloc函數、calloc函數或realloc函數的調用獲得的,size表示記憶體塊的新尺寸
c語言标準列出幾條關于realloc函數的規則:
當擴充記憶體塊時,realloc函數不會對添加進記憶體塊的自己進行初始化
如果realloc函數不能按照要求擴大記憶體塊,那麼它會傳回空指針,并且在原有的記憶體塊中的資料不會發生改變
如果realloc函數調用時以空指針作為第一個實際參數,那麼它的行為就像malloc函數一樣
如果realloc函數調用時以0作為第二個實際參數,那麼它會釋放掉記憶體塊
記憶體配置設定函數所獲得的記憶體塊都來自一個稱為堆的存儲池
上面的代碼使得p和q都指向同一塊記憶體,導緻出現記憶體洩露,使用free函數來釋放不需要的記憶體,來回收垃圾
free函數在<stdlib.h>中有如下原型:
void free(void *ptr)
以上的代碼改寫如下: