在 C 語言程式設計中,動態記憶體分配是掌握進階開發的關鍵技能。不同於靜態陣列在編譯時期固定大小,動態分配允許程式在執行期根據實際需求向堆區申請記憶體空間,靈活應對資料量不確定的場景。
void *malloc(size_t size);
int *arr = malloc(sizeof(int) * 10);
if (arr == NULL) { /* 錯誤處理 */ }
for (int i = 0; i < 10; i++) {
arr[i] = rand() % 91 + 10; // 產生 10-100 隨機數
}
free(arr); // 必須釋放,否則記憶體洩漏
// 分配 2 行 3 列整數陣列
int (*matrix)[3] = malloc(sizeof(int) * 2 * 3);
matrix[0][0] = 1;
matrix[0][1] = 13;
// 字串複製到堆區
char *str = malloc(12);
strcpy(str, "Hello,Lanou");
// 結構體動態分配
typedef struct {
char name[20];
int age;
} Person;
Person *p = malloc(sizeof(Person));
strcpy(p->name, "六娃");
p->age = 34;
| 函數 | 原型 | 特性 | 適用場景 |
|---|---|---|---|
| calloc | void *calloc(size_t n, size_t size) | 分配 n 個 size 大小區塊,自動歸零 | 需要初始化為 0 的陣列、結構體 |
| realloc | void *realloc(void *ptr, size_t new_size) | 調整已分配區塊大小,擴容保留資料,縮容可能截斷 | 動態陣列擴容、緩衝區調整 |
void *memset(void *s, int c, size_t n);
memset(&struct_var, 0, sizeof(struct_var))void *memcpy(void *dest, const void *src, size_t n);
int memcmp(const void *s1, const void *s2, size_t n);
free(ptr); ptr = NULL; 防止野指標// ❌ 錯誤:未檢查返回值
int *p = malloc(100 * sizeof(int));
p[0] = 10;
// ✅ 正確:完整錯誤處理
int *p = malloc(100 * sizeof(int));
if (!p) {
fprintf(stderr, "記憶體分配失敗\n");
exit(EXIT_FAILURE);
}
// 使用 p...
free(p);
p = NULL;