int m, n;
cin >> m >> n;
int **p = NULL;
p = new int *[m]; // 步驟 1
for (int i = 0; i < m; i++) // 步驟 2
p[i] = new int[n]; // 步驟 3
p,初始化為空。此時 p 本身佔用 8 字節(64 位系統),指向無效地址。m 個 int* 元素的指針數組。p 指向這個數組的首地址。每個元素初始化為未定義值(野指針)。n 個 int 的整型數組。完成後形成「指針數組 → 多個整型數組」的二級結構,邏輯上等價於 m 行 n 列 的二維數組。
p ────→ [指針0] → [int, int, ..., int] (n個)
[指針1] → [int, int, ..., int]
...
[指針m-1] → [int, int, ..., int]
for (int i = 0; i < m; i++)
delete[] p[i]; // 先釋放每行
delete[] p; // 再釋放指針數組
p = nullptr;
建議使用 std::vector<std::vector<int>> 或 std::unique_ptr 管理生命週期,避免手動內存管理錯誤:
vector<vector<int>> matrix(m, vector<int>(n));
// 自動釋放,支援邊界檢查