首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C 語言動態內存管理全攻略:malloc/free/realloc/calloc 核心機制與最佳實踐

     編輯:C++ 入門

系統講解 C 標準庫四大動態內存函數的原型、行為差異、常見錯誤與進階用法。

四大函數對比

函數原型初始化用途
mallocvoid* malloc(size_t size)不初始化 (垃圾值)分配原始字節塊
callocvoid* calloc(size_t n, size_t sz)全 0 初始化分配陣列,自動計算總大小 n*sz
reallocvoid* realloc(void* ptr, size_t size)保留原有數據,新增部分不初始化調整已分配塊大小,可能移動位置
freevoid free(void* ptr)釋放,不歸零指針歸還內存,ptr 必須來自前三者

核心規則

  1. 檢查返回值:分配失敗返回 NULL,必須判斷。
  2. 類型轉換:C 中 void* 隱式轉換,C++ 需顯式 static_cast。
  3. 配對使用:malloc/calloc/realloc 只能配對 free,不可混用 new/delete。
  4. 避免釋放後使用:free(p); p = NULL; 防野指針。
  5. realloc 陷阱:p = realloc(p, n) 若失敗返回 NULL 導致原指針丟失,正確寫法 void* tmp = realloc(p, n); if (tmp) p = tmp; else handle_error();

常見錯誤示例

// 錯誤:未檢查 NULL
int* p = malloc(100 * sizeof(int));
p[0] = 1; // 可能崩潰

// 正確
int* p = malloc(100 * sizeof(int));
if (!p) { perror("malloc"); exit(1); }
...
free(p); p = NULL;

進階:自定義分配器

實現內存池、對象池減少系統調用開銷,嵌入式系統常用技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved