Проблема с вводом двумерного массива

Необходимо получить от пользователя размерность массива и его элементы. При вводе его элементов возникает следующая ошибка:введите сюда описание изображения Как решить проблему? Необходимо получить от пользователя матрицу, а после вывести её в консоль (для дальнейших вычислений).

#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 шт):

Автор решения: AlexGlebe

Так как ошибка звучит 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 ;
→ Ссылка