#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)(實現相關)。
#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 可能在新區域分配並拷貝數據,必須用返回值更新指標。
NULL。realloc 必須用臨時變數接收:tmp = realloc(p, sz); if (tmp) p = tmp; else handle_error(); 避免洩漏。free(p); p = NULL; 防野指標。malloc 最通用,calloc 適合需清零場景,realloc 實現動態陣列擴容。理解 realloc 可能移動內存、必須捕獲返回值是核心。