C++ 在为矩阵列 (v[i][j-1]) 的前导元素赋值时的奇怪行为

C++ Weird behavior while giving a value to the the predecessor element of a matrix column (v[i][j-1])

所以我试图制作一个矩阵,其中主对角线的元素将逐个增加 3,我还想更改主对角线的前一个和下一个元素的值及其前身和继任者。 Something like this:

在前任元素之前一切正常。由于某种原因 v[i][j-1] 不起作用?

我想说我是初学者。

代码如下:

#include <iostream>
using namespace std;

int n, v[22][22];

int main()
{
    cin >> n;
    int k = 1;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i == j)
            {
                v[i][j] = k;
                v[i][j + 1] = k + 1;
                v[i][j - 1] = k - 1; //this is the part where it doesn't work
            }
            cout << v[i][j] << " ";
        }
        k += 3;
        cout << "\n";
    }
}

Here is the result I am getting

编辑:我也试过i和j都是从1开始的,所以不会有负的索引值。还是不行。

对于初学者来说,不需要使用嵌套的 for 循环。只用一个for循环就够了

当 i 等于 0 且 j 等于 0 时,此表达式 v[i][j - 1] 访问调用未定义行为的数组外的内存。

当表达式的 n 等于 22 并且 i 和 j 等于 n - 1 时存在同样的问题v[i][j + 1]

你应该检查这些情况。

而这个输出

cout << v[i][j] << " ";

可能会在 v[i][j-1] 尚未更新时出现。

同时尝试在使用变量的最小范围内声明变量。例如不需要在全局命名空间中声明数组。

这里展示了如何组织循环。

    int value = 1;

    for (size_t i = 0; i < n; i++)
    {
        v[i][i] = value;
        if (i != 0) v[i][i - 1] = value - 1;
        if (i != n - 1) v[i][i + 1] = value + 1;

        value += 3;
    }

    for (const auto &row : v)
    {
        for (const auto &item : row)
        {
            std::cout << std::setw( 3 ) << item << ' ';
        }
        std::cout << '\n';
    }

例如,如果 n 等于 5,则输出将为

  1   2   0   0   0
  3   4   5   0   0
  0   6   7   8   0
  0   0   9  10  11
  0   0   0  12  13