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