Я пытаюсь просто создать простую программу, в которой пользователь вводит каждое значение матрицы, затем программа печатает матрицу. До сих пор
#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]].
Может ли кто-нибудь сказать мне, почему это происходит и как это исправить?
Вы получаете неопределенное поведение для доступа к вне диапазона в matrix[i][j]
когда я или j равно n-1
для вашей matrix
объявленной как matrix[n-1][n-1]
Использование:
int matrix[n][n];//will say 0 to n-1
вместо
int matrix[n-1][n-1];
Должна быть int matrix[n][n]
. Как правило, массив A[n]
имеет индексы от 0 до n-1.
Вы переполняете границы строки, например, если у вас есть int matrix[2][2]
и установите matrix[0][2] = 42
, вы на самом деле присваиваете matrix[1][0]
, а когда вы set matrix[2][0]
вы пишете за пределами границ массива, потенциально уничтожающих некоторые другие переменные или даже стеки вызовов, что может привести к неопределенному поведению.