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

C語言動態內存分配:malloc 完全指南與避坑指南

     編輯:關於C語言

malloc 基礎原型

void *malloc(size_t size);
  • 向堆申請 size 字節內存,成功返回起始地址,失敗返回 NULL。
  • 返回類型 void*,可隱式/顯式轉換為任意指針類型。

標準使用模式

Type *ptr = (Type *)malloc(sizeof(Type));      // 單個對象
Type *arr = (Type *)malloc(n * sizeof(Type));  // 數組

關鍵三要素:sizeof(Type) 計算大小、強制轉換類型、檢查返回值。

完整示例

#include <stdio.h>
#include <stdlib.h>

struct Student {
    char name[20];
    int age;
};

int main() {
    // 1. 基本類型
    int *pi = (int *)malloc(sizeof(int));
    if (!pi) return -1;
    *pi = 42;
    free(pi);

    // 2. 結構體
    struct Student *ps = (struct Student *)malloc(sizeof(struct Student));
    if (!ps) return -1;
    snprintf(ps->name, sizeof(ps->name), "Tom");
    ps->age = 20;
    free(ps);

    // 3. 動態數組(鏈表節點典型用法)
    int n = 10;
    int *arr = (int *)malloc(n * sizeof(int));
    if (!arr) return -1;
    for (int i = 0; i < n; ++i) arr[i] = i * i;
    free(arr);
    return 0;
}

malloc vs new (C++)

特性mallocnew
返回類型void* 需轉換精確類型指針
大小計算手動 sizeof自動
構造/析構不調用自動調用
失敗處理返回 NULL拋出 bad_alloc
重新分配realloc無直接對應

核心注意事項(必讀)

  1. 永遠檢查返回值:if (!ptr) { perror("malloc"); exit(1); }
  2. 用完即 free:防止內存洩漏;free(NULL) 安全無害。
  3. 避免重複釋放:釋放後置 NULL:free(p); p = NULL;
  4. 不越界訪問:寫入範圍限於申請大小內。
  5. 釋放後不再使用:懸空指針導致未定義行為。
  6. 結構體含指針成員時:需先釋放成員指向內存,再釋放結構體本身。

常見錯誤與修正

// 錯誤:未檢查返回值
int *p = (int*)malloc(100 * sizeof(int));
p[50] = 10;

// 正確
int *p = (int*)malloc(100 * sizeof(int));
if (!p) { /* 處理錯誤 */ }
p[50] = 10;
// ...
free(p); p = NULL;

進階:realloc 與 aligned_alloc

  • realloc(ptr, new_size):調整已分配塊大小,可能移動內存,返回新地址。
  • aligned_alloc(alignment, size) (C11):分配指定對齊的內存,適用 SIMD、硬件寄存器映射。

動態內存管理是 C 語言靈活性的核心,嚴守規範,方能馴服這把雙刃劍。

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