系統講解 C 標準庫四大動態內存函數的原型、行為差異、常見錯誤與進階用法。
| 函數 | 原型 | 初始化 | 用途 |
|---|---|---|---|
| malloc | void* malloc(size_t size) | 不初始化 (垃圾值) | 分配原始字節塊 |
| calloc | void* calloc(size_t n, size_t sz) | 全 0 初始化 | 分配陣列,自動計算總大小 n*sz |
| realloc | void* realloc(void* ptr, size_t size) | 保留原有數據,新增部分不初始化 | 調整已分配塊大小,可能移動位置 |
| free | void free(void* ptr) | 釋放,不歸零指針 | 歸還內存,ptr 必須來自前三者 |
void* 隱式轉換,C++ 需顯式 static_cast。free(p); p = NULL; 防野指針。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;
實現內存池、對象池減少系統調用開銷,嵌入式系統常用技巧。