動態配置記憶體
## C 語言的動態記憶體配置
動態記憶體配置是指程式在**執行期間**,根據實際需求從堆積區(heap)取得記憶體,而不是在編譯時就決定大小。
### 要解決的問題
靜態陣列的大小通常必須事先指定,例如:
```c
int numbers[100];
```
但實際上可能只需要 10 個元素,也可能需要 1000 個元素。動態配置可以:
- 在執行時才決定資料大小
- 避免預留過多記憶體
- 建立大小可變的陣列或資料結構
- 支援鏈結串列、樹、動態字串等結構
### 常用函式
這些函式位於 `<stdlib.h>`:
| 函式 | 功能 |
|---|---|
| `malloc(size)` | 配置指定大小的記憶體,內容未初始化 |
| `calloc(count, size)` | 配置多個元素,內容初始化為 0 |
| `realloc(ptr, size)` | 調整原本配置的記憶體大小 |
| `free(ptr)` | 釋放已配置的記憶體 |
## 簡單範例
以下程式讓使用者輸入陣列大小,動態配置整數陣列,計算總和後釋放記憶體:
```c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n;
int sum = 0;
printf("請輸入元素數量:");
scanf("%d", &n);
if (n <= 0) {
printf("數量必須大於 0。\n");
return 1;
}
int *numbers = malloc(n * sizeof(int));
if (numbers == NULL) {
printf("記憶體配置失敗。\n");
return 1;
}
for (int i = 0; i < n; i++) {
numbers[i] = i + 1;
sum += numbers[i];
}
printf("總和 = %d\n", sum);
free(numbers);
numbers = NULL;
return 0;
}
```
### 注意事項
1. 配置記憶體後要檢查是否為 `NULL`。
2. 使用完畢後一定要呼叫 `free()`,避免記憶體洩漏。
3. 不可使用已經 `free()` 的指標,否則可能造成錯誤。
4. `malloc(n * sizeof(int))` 中的大小應根據資料型別計算,避免寫死位元組數。
相關學習地圖、教學課程
C 語言,系統程式