警告 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警告