天天看點

C語言動态存儲配置設定

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)

以上的代碼改寫如下:

繼續閱讀