| 方式 | 區域 | 生命週期 | 管理者 | 典型例子 | 容量限制 |
|---|---|---|---|---|---|
| 靜態分配 | 靜態儲存區 | 程式啟動~結束 | 編譯器 | 全域變數、static 變數 | 編譯期固定 |
| 堆疊分配 | Stack | 函數呼叫~返回 | 編譯器/CPU | 區域變數、函數參數 | 較小(通常 1~8 MB) |
| 堆分配 | Heap | 手動控制 | 程式設計師 | malloc/free, new/delete | 虛擬記憶體上限 |
int* p = malloc(n * sizeof(int));
if (p == NULL) return -1; // 必須檢查
// 或 assert(p != NULL);
memset 或逐一賦值初始化。for (i = 0; i <= n; i++) a[i] = 0; // 錯誤:應為 i < n
for (i = 0; i < n; i++) a[i] = 0; // 正確
malloc/free、new/delete、new[]/delete[]。free(p);
p = NULL; // 必須置空,避免誤用
sizeof(p) 回傳的是**指標變數大小**(4/8 位元組),**非指向記憶體大小**。記憶體大小需分配時自行記錄。void foo(int arr[]) 等價 void foo(int* arr),sizeof(arr) 在函數內為指標大小。NULL 後 return 錯誤碼。NULL 後 exit(1) 終止程式。new/malloc 設定自訂異常處理函數(std::set_new_handler)。盡量使用 std::vector、std::string、std::unique_ptr、std::shared_ptr 等 RAII 容器/智慧指標,將記憶體管理交給編譯器,從源頭消除上述錯誤。