嵌套 for 循环不遍历第二个数组

Nested for loop not looping through second array

如何让第二个数组正确循环?这是一个简单的矩阵乘法运算(使用 Visual Studio 2019)并且 arr 正在循环,但 arr2 没有完全循环。只有前 2 个元素乘以 arr.

的所有元素
#include <iostream>

using namespace std;

int main() {
    int r1 = 2, c1 = 3, r2 = 3, c2 = 3;

    int** arr = new int* [r1];
    for (int i = 0; i < c1; i++) {
        arr[i] = new int[c1];
    }
    for (int i = 0; i < r1; i++) {
        for (int j = 0; j < c1; j++) {
            arr[i][j] = j;
        }
    }

    int** arr2 = new int*[r2];
    for (int i = 0; i < c2; i++) {
        arr2[i] = new int[c2];
    }
    for (int i = 0; i < c2; i++) {
        for (int j = 0; j < r2; j++) {
            arr2[i][j] = j;
        }
    }

    int** arr3 = new int*[r1];
    for (int i = 0; i < c2; i++) {
        arr3[i] = new int[c2];
    }
    for (int i = 0; i < r1; i++) {
        for (int j = 0; j < c2; j++) {
            arr3[i][j] = 0;
        }
    }


    for (int i = 0; i < r1; i++) {
        for (int j = 0; j < c2; j++) {
            for (int g = 0; g < c1; g++) {
                arr3[i][j] += arr[i][g] * arr2[g][j];

                cout << "[" << i << "][" << g << "] " << arr[i][g] << "\tX\t" << "[" << g << "][" << j << "] " << arr2[g][j] << " => " << arr3[i][j] << endl;
            }
        }
    }

    cout << "\n" << endl;

    for (int i = 0; i < r1; i++) {
        for (int j = 0; j < c2; j++) {
            cout << "New Array Element: [" << i << "][" << j << "] => " << arr3[i][j] << endl;
        }
    }

    return 0;
}

您在所有循环中都犯了同样的基本错误——这个错误是您没有正确地遍历行。

当您应该使用行数时,您却使用了列数:

 int** arr = new int* [r1];
    for (int i = 0; i < c1; i++) {  // <-- This should be i < r1, not i < c1;
        arr[i] = new int[c1];
    }

其次,您可以编写一个函数来减少出错的可能性,并且更有可能发现这样的错误:

 int **createArray(int rows, int cols)
 { 
    int** arr = new int* [rows];
      for (int i = 0; i < rows; i++) { 
        arr[i] = new int[cols];
    }
    
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            arr[i][j] = j;
        }
    }
    return arr;
}

int main()
{
   int r1 = 2, c1 = 3, r2 = 3, c2 = 3;

   int** arr = createArray(r1, c1);
   int** arr2 = createArray(r2,c2);
   int** arr3 = createArray(r1,c2);
   //...
}

现在创建代码不再一遍又一遍,加上使用错误变量的问题即使没有消除也已最小化。


话虽如此,这种创建二维数组的方法是最糟糕的方法之一。现在,你的代码有内存泄漏(它仍然被认为是泄漏,即使程序将终止——内存工具如 valgrind 和其他人会在你的程序退出时立即指示错误)。

理想情况下,您可以使用 class 容器 std::vector<int> 来自动处理动态内存管理。

但即使这是一个必须使用 int** 的练习,在这些限制条件下,它仍然是创建二维数组的一种非常糟糕的方法。这是关于这个问题的 answer that goes in detail,为什么它不好,以及如何缓解它。