c語言在標頭檔案中提供了幾個記憶體分配和管理相關的函式
函式功能
void * malloc(int num);
在堆區分配一塊指定大小的記憶體空間,這塊記憶體空間在函式執行完後不會被初始化,它們的值是未知的
void free(void * address);
釋放address所指向的記憶體塊,釋放動態分配的記憶體空間
void *calloc(int num,int size);
在記憶體中動態分配num個長度為size的連續空間,並將每個位元組都初始化為0
void * realloc(void *address,int newsize);
重新分配記憶體,把記憶體擴充套件到newsize
原型:void * malloc(unsigned int num_bytes);
功能:分配長度為num_bytes位元組的記憶體塊,分配的是堆上連續的空間
返回值:如果分配失敗,返回空指標;如果分配成功,返回指向被分配記憶體的指標
返回的是void *指標,可以進行強制型別轉換成其他任何型別的指標
使用malloc分配記憶體後一定要檢查記憶體分配是否成功
int
*p=(
int*
)malloc(4
*sizeof
(int))
;assert
(p!=
nullptr
);
原型:void free(void * memblock);
使用free()函式會產生程式崩潰的幾種狀況:
①訪問越界
//越界崩潰
intmain()
free
(p);
}
②重複釋放記憶體
③釋放非動態記憶體
int
main()
原型:void * calloc(size_t num,size_t size);
功能:在記憶體的動態儲存區中分配n個長度為size的連續空間,並將每個位元組置為0。函式返回乙個指向分配起始位址的指標;如果分配不成功,返回空指標
注意:calloc分配的記憶體要用free()對記憶體進行釋放。
calloc & malloc的區別:
①malloc傳入乙個引數,表示分配的位元組數;realloc傳入兩個引數n和size,分配n個長度為size的連續空間
②malloc只分配記憶體空間,不初始化,初值是隨機值;calloc不僅分配記憶體空間,而且自動初始化為0
原型:void *realloc(void *memblock,size_t size);
功能:先判斷當前指標指向的記憶體空間是否有足夠的連續空間,如果有,擴大memblock指向的位址,返回memblock。如果空間不夠,先按照size指定的大小分配空間,將原來的資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來memblock所指的記憶體區域,返回新分配的記憶體區域的首位址。
返回值:如果重新分配成功,則返回指向被分配記憶體的指標,否則返回空指標
當動態記憶體不再使用時,應使用free()函式將記憶體塊釋放
①對null指標進行解引用操作->忘記檢查所請求的記憶體是否成功分配
②對分配的記憶體進行操作時越過邊界
③用free釋放並非動態分配的記憶體
④釋放一塊動態分配的記憶體的一部分->動態分配的記憶體必須整塊一起釋放
⑤動態記憶體使用完不釋放->記憶體洩漏
C語言動態記憶體管理
1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...
C語言動態記憶體管理
c系統的函式庫中提供了了程式動態申請和釋放記憶體儲存塊的庫函式,下面將分別介紹。1 malloc 函式 a 該函式的原型 void malloc size t size b 該函式只有乙個引數,且形參size是無符號整型,該引數代表申請空間的位元組數。c 返回值 如果記憶體池中的可用記憶體滿足需求,...
C語言動態記憶體管理
在說明c語言記憶體管理之前,要知道什麼是記憶體,記憶體我個人認為可以理解為帶有標籤的盒子,所謂的帶標籤的盒子就像我們住的寢室一樣有門牌號,盒子內只能儲存固定型別的資料或變數,就如男生寢室只能住男生一樣。那麼c語言中有多少種盒子呢?有靜態儲存區 動態儲存區 內部暫存器區域。我們通常定義的變數如果沒有特...