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