Программа крашится при попытке распечатать массив - C (СИ)
Формулировка задачи:
Доброго времени суток.
Имеется программа, которая в мейне инициализирует двухмерный динамический массив, количество строк и столбцов этого массива. Ввод количества строк\столбцов массива, выделение памяти для него и заполнение происходит в отдельной функции(все эти данные должны вернуться в мейн), потом происходит печать в другой функции. Запутался в указателях и программа крашится при попытке распечатать массив. Ошибка, скорее всего, при вводе массива или при выделении памяти. Компилятор выдаёт следующие "|65|warning: 'matr' is used uninitialized in this function [-Wuninitialized]|"
Сразу хочу сказать почему изобретаю такой велосипед - в данный момент выполняю лаб. работу, которая будет достаточно объемная с консольным меню (примитивная реализация через swith), поэтому решил разнести большинство действий в отдельные функции. Так же замечу что данный код - просто маленький тест, через который я пытаюсь понять как правильно расставить указатели.
Сам код:
Пытался найти решение проблемы на форуме, однако так и не получилось исправить ошибку.
Прошу расставить правильно указатели и объяснить почему нужно именно так.
Так же буду благодарен если кто нибудь поделится справочным материалом по этой теме и несколькими практическими заданиями.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int inMatr(int **matr, int *n, int *m)
{
int i, j;
printf ("Количество строк = ");
scanf ("%d", &*n);
printf ("Количество столбцов = ");
scanf ("%d", &*m);
matr = (int**) calloc ((*n), sizeof(int*));
if (matr == NULL)
{
printf ("Ошибка 1");
system ("pause");
}
for (i = 0; i < (*n); i++)
{
matr[i] = (int*) calloc ((*m), sizeof(int));
if (matr[i] == NULL)
{
printf ("Ошибка 2");
system ("pause");
}
for (j = 0; j < (*m); j++)
{
printf ("Вводим элемент matr[%d][%d]", i, j);
scanf ("%d", &matr[i][j]);
}
}
return 0;
}
int printMatr( int **matr, int n, int m)
{
int i, j;
printf ("n = %d\nm = %d\n", n, m);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
printf ("%3d", matr[i][j]);
}
printf ("\n");
}
return 0;
}
int main()
{
system("chcp 1251");
system ("cls");
int n, m;
int **matr;
inMatr(matr, &n, &m);
printMatr(matr, n, m);
system ("pause");
return 0;
}Решение задачи: «Программа крашится при попытке распечатать массив»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int inMatr(int ***matr, int *n, int *m)
{
int i, j;
printf ("Количество строк = ");
scanf ("%d", n);
printf ("Количество столбцов = ");
scanf ("%d", m);
*matr = calloc (*n, sizeof(int*));
if ((*matr) == NULL)
{
printf ("Ошибка 1");
system ("pause");
}
for (i = 0; i < *n; i++)
{
(*matr)[i] = calloc (*m, sizeof(int));
if (((*matr)[i]) == NULL)
{
printf ("Ошибка 2");
system ("pause");
}
for (j = 0; j < *m; j++)
{
printf ("Вводим элемент matr[%d][%d]", i, j);
scanf ("%d", matr[i][j]);
}
}
return 0;
}
int printMatr( int **matr, int n, int m)
{
int i, j;
printf ("n = %d\nm = %d\n", n, m);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
printf ("%3d", matr[i][j]);
}
printf ("\n");
}
return 0;
}
int main()
{
system("chcp 1251");
system ("cls");
int n, m;
int **matr = NULL;
inMatr(&matr, &n, &m);
printMatr(matr, n, m);
system ("pause");
return 0;
}
Объяснение кода листинга программы
- Программа начинается с заголовка, который включает в себя необходимые библиотеки: stdio.h, string.h и stdlib.h.
- Затем определяются две функции: inMatr и printMatr.
- Функция inMatr запрашивает у пользователя количество строк и столбцов для матрицы, а затем выделяет память для матрицы и её элементов. Если выделение памяти не удалось, программа выводит сообщение об ошибке и завершается.
- Функция printMatr выводит матрицу на экран. Для этого она перебирает все элементы матрицы, выводит их на экран и добавляет символ новой строки после каждой строки.
- В функции main создается пустая матрица и вызывается функция inMatr, которая заполняет матрицу значениями, введенными пользователем. Затем вызывается функция printMatr, чтобы вывести матрицу на экран.
- В конце программы вызывается функция system(
pause), чтобы программа не закрылась сразу после вывода матрицы, позволяя пользователю увидеть результат. - Значения n и m инициализируются как неопределенные значения, пока пользователь не введет количество строк и столбцов.
- Код, который вызывает ошибку, находится в функции inMatr, в которой происходит попытка доступа к памяти, выделенной для матрицы, до того, как эта память была выделена. Это происходит в строке, где происходит попытка доступа к matr[i][j], где i или j могут быть нулями, и матрица еще не была заполнена.