Программа крашится при попытке распечатать массив - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Имеется программа, которая в мейне инициализирует двухмерный динамический массив, количество строк и столбцов этого массива. Ввод количества строк\столбцов массива, выделение памяти для него и заполнение происходит в отдельной функции(все эти данные должны вернуться в мейн), потом происходит печать в другой функции. Запутался в указателях и программа крашится при попытке распечатать массив. Ошибка, скорее всего, при вводе массива или при выделении памяти. Компилятор выдаёт следующие "|65|warning: 'matr' is used uninitialized in this function [-Wuninitialized]|" Сразу хочу сказать почему изобретаю такой велосипед - в данный момент выполняю лаб. работу, которая будет достаточно объемная с консольным меню (примитивная реализация через swith), поэтому решил разнести большинство действий в отдельные функции. Так же замечу что данный код - просто маленький тест, через который я пытаюсь понять как правильно расставить указатели. Сам код:
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. int inMatr(int **matr, int *n, int *m)
  5. {
  6. int i, j;
  7. printf ("Количество строк = ");
  8. scanf ("%d", &*n);
  9. printf ("Количество столбцов = ");
  10. scanf ("%d", &*m);
  11. matr = (int**) calloc ((*n), sizeof(int*));
  12. if (matr == NULL)
  13. {
  14. printf ("Ошибка 1");
  15. system ("pause");
  16. }
  17. for (i = 0; i < (*n); i++)
  18. {
  19. matr[i] = (int*) calloc ((*m), sizeof(int));
  20. if (matr[i] == NULL)
  21. {
  22. printf ("Ошибка 2");
  23. system ("pause");
  24. }
  25. for (j = 0; j < (*m); j++)
  26. {
  27. printf ("Вводим элемент matr[%d][%d]", i, j);
  28. scanf ("%d", &matr[i][j]);
  29. }
  30. }
  31. return 0;
  32. }
  33. int printMatr( int **matr, int n, int m)
  34. {
  35. int i, j;
  36. printf ("n = %d\nm = %d\n", n, m);
  37. for (i = 0; i < n; i++)
  38. {
  39. for (j = 0; j < m; j++)
  40. {
  41. printf ("%3d", matr[i][j]);
  42. }
  43. printf ("\n");
  44. }
  45. return 0;
  46. }
  47. int main()
  48. {
  49. system("chcp 1251");
  50. system ("cls");
  51. int n, m;
  52. int **matr;
  53. inMatr(matr, &n, &m);
  54. printMatr(matr, n, m);
  55. system ("pause");
  56. return 0;
  57. }
Пытался найти решение проблемы на форуме, однако так и не получилось исправить ошибку. Прошу расставить правильно указатели и объяснить почему нужно именно так. Так же буду благодарен если кто нибудь поделится справочным материалом по этой теме и несколькими практическими заданиями.

Решение задачи: «Программа крашится при попытке распечатать массив»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. int inMatr(int ***matr, int *n, int *m)
  6. {
  7.     int i, j;
  8.  
  9.     printf ("Количество строк = ");
  10.     scanf ("%d", n);
  11.  
  12.     printf ("Количество столбцов = ");
  13.     scanf ("%d", m);
  14.  
  15.     *matr = calloc (*n, sizeof(int*));
  16.     if ((*matr) == NULL)
  17.     {
  18.         printf ("Ошибка 1");
  19.         system ("pause");
  20.     }
  21.  
  22.     for (i = 0; i < *n; i++)
  23.     {
  24.         (*matr)[i] = calloc (*m, sizeof(int));
  25.         if (((*matr)[i]) == NULL)
  26.             {
  27.                 printf ("Ошибка 2");
  28.                 system ("pause");
  29.             }
  30.  
  31.         for (j = 0; j < *m; j++)
  32.         {
  33.             printf ("Вводим элемент matr[%d][%d]", i, j);
  34.             scanf ("%d", matr[i][j]);
  35.         }
  36.     }
  37.     return 0;
  38. }
  39.  
  40. int printMatr( int **matr, int n, int m)
  41. {
  42.     int i, j;
  43.     printf ("n = %d\nm = %d\n", n, m);
  44.  
  45.     for (i = 0; i < n; i++)
  46.     {
  47.         for (j = 0; j < m; j++)
  48.         {
  49.             printf ("%3d", matr[i][j]);
  50.         }
  51.         printf ("\n");
  52.     }
  53.     return 0;
  54. }
  55.  
  56. int main()
  57. {
  58.     system("chcp 1251");
  59.     system ("cls");
  60.  
  61.     int n, m;
  62.     int **matr = NULL;
  63.  
  64.     inMatr(&matr, &n, &m);
  65.     printMatr(matr, n, m);
  66.  
  67.     system ("pause");
  68.  
  69.     return 0;
  70. }

Объяснение кода листинга программы

  1. Программа начинается с заголовка, который включает в себя необходимые библиотеки: stdio.h, string.h и stdlib.h.
  2. Затем определяются две функции: inMatr и printMatr.
  3. Функция inMatr запрашивает у пользователя количество строк и столбцов для матрицы, а затем выделяет память для матрицы и её элементов. Если выделение памяти не удалось, программа выводит сообщение об ошибке и завершается.
  4. Функция printMatr выводит матрицу на экран. Для этого она перебирает все элементы матрицы, выводит их на экран и добавляет символ новой строки после каждой строки.
  5. В функции main создается пустая матрица и вызывается функция inMatr, которая заполняет матрицу значениями, введенными пользователем. Затем вызывается функция printMatr, чтобы вывести матрицу на экран.
  6. В конце программы вызывается функция system(pause), чтобы программа не закрылась сразу после вывода матрицы, позволяя пользователю увидеть результат.
  7. Значения n и m инициализируются как неопределенные значения, пока пользователь не введет количество строк и столбцов.
  8. Код, который вызывает ошибку, находится в функции inMatr, в которой происходит попытка доступа к памяти, выделенной для матрицы, до того, как эта память была выделена. Это происходит в строке, где происходит попытка доступа к matr[i][j], где i или j могут быть нулями, и матрица еще не была заполнена.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы