Проблема с вводом двумерного массива
Необходимо получить от пользователя размерность массива и его элементы.
При вводе его элементов возникает следующая ошибка:
Как решить проблему? Необходимо получить от пользователя матрицу, а после вывести её в консоль (для дальнейших вычислений).
#include <stdio.h>
#include <locale.h>
#include <math.h>
int main()
{
setlocale(LC_ALL, "Rus");
//row - строки, col - столбцы
int row, col;
//Visual Studio не позволяет создать массив a[row][col], создаю a[1][1], чтобы потом переопределить
int a[1][1];
int i, j;
printf("Число строк: ");
scanf_s("%d", &row);
printf("Число столбцов: ");
scanf_s("%d", &col);
//переопределяю массив новыми размерами
a[row][col];
printf("Ввод матрицы \n");
for (i = 0; i < row; ++i) {
for (j = 0; j < col; ++j)
{
scanf_s("%d", &a[i][j]);
}
}
return 0;
}
Ответы (1 шт):
Так как ошибка звучит stack .. corrupted, это значит, что матрица a[1][1] хранится в стеке. А вы пишете в эту матрицу с неправильными индексами ( больше чем 1). a[x][y]; - это не переопределение, а бессмысленная команда типа 2+2;. Она ничего не делает.
Создавать массив плавающего размера можно только в динамической памяти (куче). Так как индексация матриц плавающего размера не определена стандартом, используйте только массив.
/* C */
int * a ;
a = malloc ( sizeof ( int ) * row * col ) ;
a [ col * i + j ] = 777 ; // i - строка , j - столбец
free ( a ) ;
/* C++ */
int * a ;
a = new int [ row * col ] ;
a [ col * i + j ] = 777 ; // i - строка , j - столбец
delete [ ] a ;
Есть ещё вариант представления матрицы в виде дерева. Все строки матрицы разбросаны в памяти бесконтрольно, но удобнее работать с индексами.
/* C */
int * * a ;
a = malloc ( sizeof ( int * ) * row ) ;
for ( int i = 0 ; i < row ; ++ i )
a [ i ] = malloc ( sizeof ( int ) * col ) ;
a [ i ] [ j ] = 777 ; // i - строка , j - столбец
for ( int i = 0 ; i < row ; ++ i )
free ( a [ i ] ) ;
free ( a ) ;
/* C++ */
int * * a ;
a = new int * [ row ] ;
for ( int i = 0 ; i < row ; ++ i )
a [ i ] = new int [ col ] ;
a [ i ] [ j ] = 777 ; // i - строка , j - столбец
for ( int i = 0 ; i < row ; ++ i )
delete [ ] ( a [ i ] ) ;
delete [ ] a ;