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

C語言動態內存分配:malloc、calloc 與 realloc 的區別、聯系與使用陷阱

     編輯:關於C語言

函數原型

void* malloc(size_t size);
void* calloc(size_t num, size_t size);
void* realloc(void* ptr, size_t new_size);

核心區別

函數功能內存初始化典型用途
malloc分配 size 字節連續空間不初始化(垃圾值)通用分配
calloc分配 num 塊 size 字節空間自動清零數組/結構體零初始化
realloc調整 ptr 所指空間至 new_size保留原數據,新增部分不初始化動態擴容/縮容

realloc 關鍵行為

  • 可能返回**新地址**(原地址無法擴展時會分配新塊、拷貝數據、釋放舊塊)。
  • **必須用臨時指針接收返回值**,防止分配失敗導致原指針丟失內存洩漏。
  • realloc(NULL, size) == malloc(size);realloc(ptr, 0) == free(ptr)(實現相關)。

完整演示代碼

int *p = malloc(4 * sizeof(int));
if (!p) exit(1);
for (int i=0; i<4; i++) p[i] = 10-i;

int *np = realloc(p, 100 * sizeof(int));
if (!np) { free(p); exit(1); }
p = np;  // 更新指針
// np[0..3] 保持 10,9,8,7

三者聯系

  • calloc(n, s) ≡ malloc(n*s) + memset(0)。
  • realloc(ptr, size) 在 ptr==NULL 時退化為 malloc(size)。

常見錯誤

  1. 未檢查返回值為 NULL。
  2. realloc 直接賦值給原指針,失敗時舊內存無法釋放。
  3. 釋放後繼續使用(懸空指針),或重複 free。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved