C++动态数组中的C6385, C6386警告

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

 
 
原文地址:https://www.cnblogs.com/bloodmage/p/11956672.html