靜態分配:編譯期根據定義預分配固定大小內存,生命周期固定。
動態分配:運行期按需申請(malloc/calloc)、釋放(free)、調整(realloc),靈活高效,適用於數據規模不可預知場景。需包含<stdlib.h>。
void *malloc(size_t size); // 分配size字節,成功返回起始地址,失敗返回NULL
void free(void *ptr); // 釋放ptr指向的動態內存,ptr必須來自malloc/calloc/realloc
void*,使用時需強制類型轉換:(int*)malloc(sizeof(int))。sizeof:p = malloc(n * sizeof(*p)),利於移植。free後指針變為野指針,良習:free(p); p = NULL;。void *calloc(size_t nmemb, size_t size); // 分配nmemb個size字節元素,自動清零
free。void *realloc(void *ptr, size_t size); // 調整已分配塊大小,可能移動內存
ptr==NULL等同malloc;size==0實現視庫而定(可能釋放或返回唯一指針)。需求:輸入三個整數,動態分配存儲,升序輸出。
int *p1 = malloc(sizeof(int));
int *p2 = malloc(sizeof(int));
int *p3 = malloc(sizeof(int));
if (p1 && p2 && p3) {
scanf("%d%d%d", p1, p2, p3);
// 簡單交換排序
if (*p1 > *p2) swap(p1, p2);
if (*p1 > *p3) swap(p1, p3);
if (*p2 > *p3) swap(p2, p3);
printf("%d %d %d\n", *p1, *p2, *p3);
}
free(p1); free(p2); free(p3);
關鍵點:分配後檢查NULL、使用sizeof而非魔數、用完釋放。
free或free非堆指針。malloc(4)代替malloc(sizeof(int)),移植性差。建議:封裝安全分配宏/函數,統一錯誤處理;大塊分配考慮mmap;嵌入式環境關注碎片整理。