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

C語言動態內存管理:malloc、calloc、realloc 詳解與實戰

     編輯:關於C

三大函數聲明


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

成功返回分配區首地址(void*),失敗返回 NULL。

功能差異

函數行為初始化典型用途
malloc分配 size 字節不初始化(垃圾值)通用分配
calloc分配 num * size 字節全 0 填充陣列/結構體清零
realloc調整 ptr 區域至 new_size擴展部分不初始化;縮減保留原數據動態擴容/縮容

關鍵關聯

  • calloc(n, s) ≡ malloc(n*s) + memset(0)。
  • realloc(NULL, size) ≡ malloc(size)。
  • realloc(ptr, 0) 行為等同 free(ptr)(實現相關)。

realloc 內存遷移演示


#include 
#include 

int main() {
    int *ptr = malloc(4 * sizeof(int));  // 4 ints
    for (int i = 0; i < 4; i++) ptr[i] = 10 - i;

    int *new_ptr = realloc(ptr, 100 * sizeof(int));  // 擴容至 100 ints
    printf("舊地址: %p\n新地址: %p\n", (void*)ptr, (void*)new_ptr);
    for (int i = 0; i < 4; i++) printf("%d ", new_ptr[i]);  // 數據保留
    free(new_ptr);
    return 0;
}

realloc地址變化

輸出顯示地址改變,證明 realloc 可能在新區域分配並拷貝數據,必須用返回值更新指標。

最佳實踐

  1. 永遠檢查返回值是否 NULL。
  2. realloc 必須用臨時變數接收:tmp = realloc(p, sz); if (tmp) p = tmp; else handle_error(); 避免洩漏。
  3. 釋放後置空:free(p); p = NULL; 防野指標。
  4. 嵌入式/實時系統慎用動態分配,優先靜態池。

總結

malloc 最通用,calloc 適合需清零場景,realloc 實現動態陣列擴容。理解 realloc 可能移動內存、必須捕獲返回值是核心。

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