float score[30]; // 固定大小陣列
問題:
realloc)原型:void *malloc(size_t size);
功能:在堆區分配 size 位元組連續空間
參數:無號整數(位元組數)
返回值:指向分配區起始位址的 void* 指標;失敗返回 NULL
原型:void free(void *ptr);
功能:釋放 ptr 指向的先前由 malloc/calloc/realloc 分配的區塊
參數:必須是先前分配函數返回的指標值
警告:傳遞其他值 → 未定義行為(崩潰、資料損毀)
#include
#include
main() {
int count, *array;
// 分配 10 個 int 空間(10 * 4 bytes = 40 bytes)
if ((array = (int *)malloc(10 * sizeof(int))) == NULL) {
printf("無法分配記憶體空間。\n");
exit(1);
}
// 賦值
for (count = 0; count < 10; count++)
array[count] = count;
// 列印
for (count = 0; count < 10; count++)
printf("%2d", array[count]);
// 釋放(良好習慣)
free(array);
}
malloc(10 * sizeof(int)):分配空間,返回 void*(int *):強制轉型為 int*array = ...:指派給指標變數== NULL:檢查分配是否成功
int *p1, *p2;
p1 = malloc(10 * sizeof(int));
p2 = p1; // p2 指向同一區塊
// ... 使用記憶體 ...
free(p2); // 正確:釋放 p2 指向的區塊(等同 free(p1))
// free(p1); // 錯誤:重複釋放!
核心:free 看的是指標值(位址),而非指標變數本身。同一區塊只能釋放一次。
| 函數 | 角色 | 比喻 |
|---|---|---|
| malloc | 分配新區塊 | 租房子 |
| free | 歸還區塊 | 退房子 |
| 函數 | 原型 | 特性 |
|---|---|---|
| calloc | void *calloc(size_t n, size_t size) | 分配 n 个 size 位元組區塊,自動歸零 |
| realloc | void *realloc(void *ptr, size_t size) | 調整現有區塊大小(擴大/縮小),保留原資料 |
int *p = malloc(10 * sizeof(int));
// ... 使用 ...
p = realloc(p, 20 * sizeof(int)); // 擴大為 20 個 int
if (p == NULL) { /* 處理失敗 */ }
// 原前 10 個元素值保留,新增 10 個未初始化
free(p); p = NULL; 防止野指標誤用malloc(n * sizeof(int)) 而非硬編碼位元組數posix_memalign、aligned_alloc| 錯誤 | 後果 | 修正 |
|---|---|---|
| 未檢查 NULL | 解參考 NULL → 段錯誤 | 必加 if 判斷 |
| 重複 free | 堆損毀、崩潰 | free 後置 NULL |
| free 非 malloc 指標 | 未定義行為 | 只 free malloc 返回值 |
| 記憶體洩漏 | 可用記憶體耗盡 | 所有路徑確保 free |
| 使用已釋放記憶體 | 資料損毀、安全漏洞 | free 後置 NULL |
| 柔性陣列成員誤用 | 越界寫入 | 正確計算總大小 |