Динамические массивы, передача по ссылке в функцию - C (СИ)

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

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

Доброго времени суток. Передаю в функцию ссылку на двумерный массив, внутри функции резервирую память и забиваю значениями с клавиатуры. Увы, ловлю сегфолт на втором элементе первой строки. Где ошибка? Работаю с динамикой первый раз.
void getInput(int *width,
              int *heigth,
              int** *bitmap, //array[w][h], initializing in function;
              );
 
int main()
{
    int width, heigth;
    int** bitmap;
    getInput(&width, &heigth, &bitmap); //передаем ссылки на массивы и переменные, чтобы ф-я могла в них писать
    return 0;
}
 
void getInput(int *width, int *heigth, int** *bitmap) //получаем указатели на переданные переменные
{
    unsigned int i, j, x, y, bit, valid = 0; //unsigned, чтобы не было отрицательного ввода. Знаю, сурово, ибо сегфолт.
 
    printf("Enter labyrinth width: ");
    scanf("%i", width);
    printf("Enter labyrinth heigth: ");
    scanf("%i", heigth);
 
    //get WxH bitmam
    printf("Enter labyrinth bitmap:\n");
    *bitmap = (int**) malloc(*heigth * sizeof(int)); //резервируем память для heigth строк
    for(i = 0; i < *heigth; i++)
    {
        *bitmap[i] = (int*) malloc(*width * sizeof(int)); //резервируем память для width ячеек в строке i
        for(j = 0; j < *width; j++)
            scanf("%i", bitmap[i][j]);
    }
}

Решение задачи: «Динамические массивы, передача по ссылке в функцию»

textual
Листинг программы
void getInput(int *width, int *heigth, int** *bitmap) //получаем указатели на переданные переменные
{
    unsigned int i, j, x, y, bit, valid = 0; //unsigned, чтобы не было отрицательного ввода. Знаю, сурово, ибо сегфолт.
    int tW;
    int tH;
    int ** tBm;
    printf("Enter labyrinth width: ");
    scanf("%i", &tW);
    printf("Enter labyrinth heigth: ");
    scanf("%i", &tH);
 
    //get WxH bitmam
    printf("Enter labyrinth bitmap:\n");
    tBm= (int**) malloc(*heigth * sizeof(int *)); //резервируем память для heigth строк
    for(i = 0; i < tH; i++)
    {
        tBm[i] = (int*) malloc(*width * sizeof(int)); //резервируем память для width ячеек в строке i
        for(j = 0; j <tW; j++)
            scanf("%i", &tBm[i][j]);
    }
 
*bitmap=tBm;
*heigth=tH;
*width=tW;
}

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

В этом коде мы создаем функцию, которая принимает три аргумента: указатель на переменную типа int, указатель на переменную типа int и указатель на указатель типа int.

  1. Объяснение кода:
    • В функции объявлены следующие переменные:
      • unsigned int i, j, x, y, bit, valid = 0;
      • int tW;
      • int tH;
      • int ** tBm;
      • Эти переменные используются для хранения информации, полученной от пользователя, и для управления динамической памятью.
    • Далее, с помощью функции scanf, мы запрашиваем у пользователя ввод ширины и высоты лабиринта:
      • printf(Enter labyrinth width:);
      • scanf(%i, &tW);
      • printf(Enter labyrinth heigth:);
      • scanf(%i, &tH);
    • Мы выделяем память под массив указателей на int с помощью функции malloc. Для каждого элемента этого массива мы также выделяем память под строку int с помощью той же функции:
      • tBm= (int*) malloc(heigth sizeof(int ));
      • for(i = 0; i < tH; i++)
      • {
      • tBm[i] = (int) malloc(width * sizeof(int));
      • for(j = 0; j <tW; j++)
      • {
      • scanf(%i, &tBm[i][j]);
      • }
      • }
    • Мы присваиваем адрес выделенной памяти переменной tBm, которую мы передаем в качестве аргумента в функцию:
      • *bitmap=tBm;
    • Наконец, мы присваиваем значения переменным, которые мы передаем в функцию:
      • *heigth=tH;
      • *width=tW;
  2. Код корректно работает, если пользователь вводит корректные значения ширины и высоты лабиринта. Однако, если пользователь вводит некорректные значения (например, отрицательные числа), то программа может работать некорректно из-за использования функции scanf без проверки ошибок.
  3. Код не содержит обработки ошибок, поэтому если пользователь введет некорректные значения, программа может выдать неопределенное поведение.
  4. Код использует функцию malloc для выделения памяти под динамические массивы, но не освобождает эту память после использования. Это может привести к утечкам памяти, если функция getInput вызывается несколько раз.

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


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

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

9   голосов , оценка 3.778 из 5
Похожие ответы