c語言 動態內存管理

綜述

c語言在<stdlib.h>頭文件中提供了幾個內存分配和管理相關的函數

函數 功能
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

malloc

原型:void * malloc(unsigned int num_bytes);
功能:分配長度爲num_bytes字節的內存塊,分配的是堆上連續的空間
返回值:如果分配失敗,返回空指針;如果分配成功,返回指向被分配內存的指針
返回的是void *指針,可以進行強制類型轉換成其他任何類型的指針
使用malloc分配內存後一定要檢查內存分配是否成功

int *p=(int *)malloc(4*sizeof(int));
assert(p!=nullptr);

free

原型:void free(void * memblock);
使用free()函數會產生程序崩潰的幾種狀況:
①訪問越界

//越界崩潰
int main()
{
  int *p=(int *)malloc(10*sizeof(int));   //申請10個整型單元內存
  for(int i=0;i<=10;i++) //11個,越界
  {
     p[i]=0;
  }
  free(p);
}

②重複釋放內存
③釋放非動態內存

int main()
{
   int arr[10];  
   free(arr);  //arr不是動態分配的內存,無法釋放
}

calloc

原型:void * calloc(size_t num,size_t size);
功能:在內存的動態存儲區中分配n個長度爲size的連續空間,並將每個字節置爲0。函數返回一個指向分配起始地址的指針;如果分配不成功,返回空指針
注意:calloc分配的內存要用free()對內存進行釋放。
calloc & malloc的區別:
①malloc傳入一個參數,表示分配的字節數;realloc傳入兩個參數n和size,分配n個長度爲size的連續空間
②malloc只分配內存空間,不初始化,初值是隨機值;calloc不僅分配內存空間,而且自動初始化爲0

realloc

原型:void *realloc(void *memblock,size_t size);
功能:先判斷當前指針指向的內存空間是否有足夠的連續空間,如果有,擴大memblock指向的地址,返回memblock。如果空間不夠,先按照size指定的大小分配空間,將原來的數據從頭到尾拷貝到新分配的內存區域,而後釋放原來memblock所指的內存區域,返回新分配的內存區域的首地址。
返回值:如果重新分配成功,則返回指向被分配內存的指針,否則返回空指針

當動態內存不再使用時,應使用free()函數將內存塊釋放

常見的動態內存錯誤

①對NULL指針進行解引用操作->忘記檢查所請求的內存是否成功分配
②對分配的內存進行操作時越過邊界
③用free釋放並非動態分配的內存
④釋放一塊動態分配的內存的一部分->動態分配的內存必須整塊一起釋放
⑤動態內存使用完不釋放->內存泄漏

發佈了95 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章