警告 C6385 從“m”中讀取的數據無效: 可讀大小為“col*sizeof(int)”個字節,但可能讀取了“8”個字節。
警告 C6386 寫入到“m”時緩沖區溢出: 可寫大小為“col*sizeof(int)”個字節,但可能寫入了“8”個字節
這兩個警告都與動態數組的可變大小與實際使用的下標有關
如以下代碼
void Knap::dp() { // if (n <= 2 || c <= 0) return; int** m = new int* [n]; for (int i = 0; i < n; i++) m[i] = new int[c + 1]{ 0 }; ... for (int i = n - 2; i > 0; i--) { ... for (int j = w[i]; j <= c; j++) m[i][j] = max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]); } m[0][c] = m[1][c]; if (c >= w[0]) m[0][c] = max(m[0][c], m[1][c - w[0]] + v[0]); ... for (int i = 0; i < n; i++) delete[] m[i]; delete[] m; }
二維數組m申請了 n * (c+1) 大小的空間,維度是變量
但在實際操作中下標用到了 n-2,和m[1][c],因此至少要求n>2
取消第一行的注釋,可以消除C6385警告