Программа крашится при попытке распечатать массив - 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 могут быть нулями, и матрица еще не была заполнена.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д