Динамические массивы, передача по ссылке в функцию - 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.
- Объяснение кода:
- В функции объявлены следующие переменные:
- 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);
- printf(
- Мы выделяем память под массив указателей на 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;
- В функции объявлены следующие переменные:
- Код корректно работает, если пользователь вводит корректные значения ширины и высоты лабиринта. Однако, если пользователь вводит некорректные значения (например, отрицательные числа), то программа может работать некорректно из-за использования функции scanf без проверки ошибок.
- Код не содержит обработки ошибок, поэтому если пользователь введет некорректные значения, программа может выдать неопределенное поведение.
- Код использует функцию malloc для выделения памяти под динамические массивы, но не освобождает эту память после использования. Это может привести к утечкам памяти, если функция getInput вызывается несколько раз.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д