函數原型
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)。
常見錯誤
- 未檢查返回值為
NULL。
realloc 直接賦值給原指針,失敗時舊內存無法釋放。
- 釋放後繼續使用(懸空指針),或重複
free。