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

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM