0

ユーザーが行列のすべての値を入力すると、プログラムが行列を出力する単純なプログラムを作成しようとしています。これまでのところ、

#include <iostream>

using namespace std;
int main()
{
    int n;
    cout << "A is an nxn matrix.\nn=";
    cin >> n;
    int matrix[n-1][n-1];
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
        {
            cout << "A[" << i+1 << "][" << j+1 << "]=";
            cin >> matrix[i][j];
        }
    }
    cout << "[[ ";
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
        {
            cout << matrix[i][j] << " ";
        }
        if (i!=n-1) //Just to make the output pretty
            cout << "]\n [ ";
        else
            cout << "]]";
    }
}

`

ただし、[[1,2,3][4,5,6][7,8,9]] など、任意のサイズの行列を入力すると、プログラムは [[1,2,4][ 4,5,7][7,8,9]]。

なぜこれが起こっているのか、それを修正する方法を教えてもらえますか?

4

2 に答える 2

2

matrix[i][j]i または j が次のように宣言されている場合、範囲外にアクセスすると未定義の動作が発生n-1しますmatrixmatrix[n-1][n-1]

使用する:

int matrix[n][n]; // will say 0 to n-1

それ以外の

int matrix[n-1][n-1];

于 2013-10-09T03:23:29.373 に答える
0

する必要がありますint matrix[n][n]。通常、配列A[n]には 0 から n-1 までのインデックスがあります。

行の境界をオーバーフローしています。たとえば、int matrix[2][2]と setmatrix[0][2] = 42がある場合、実際には を割り当てていmatrix[1][0]ます。 setmatrix[2][0]の場合、配列の境界を超えて書き込みを行っているため、他の変数やコール スタックが破壊される可能性があり、未定義の動作が発生する可能性があります。

于 2013-10-09T03:29:37.067 に答える