Программа крашится при попытке распечатать массив - 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;
}

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

  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
Похожие ответы