#arrays #c #string #memory-management #dynamic-memory-allocation
#массивы #c #строка #управление памятью #динамическое выделение памяти
Вопрос:
Проблема сортировки массива строк в Hackerrank имеет цикл для приема входных данных в 2D массив строк. Этот цикл динамически выделяет память для каждой строки с помощью malloc()
, принимает входные данные с помощью scanf()
, а затем перераспределяет блок с помощью еще одного блока.
int n;
scanf("%d", amp;n);
char** arr;
arr = (char**)malloc(n * sizeof(char*));
for(int i = 0; i < n; i ){
*(arr i) = malloc(1024 * sizeof(char));
scanf("%s", *(arr i));
*(arr i) = realloc(*(arr i), strlen(*(arr i)) 1);
}
ссылка: https://www.hackerrank.com/challenges/sorting-array-of-strings/problem
У меня два вопроса:
- Для чего используется этот дополнительный блок памяти?
- Почему он используется
scanf()
для ввода строки, а неfgets()
? Разве это не хорошая практика?
Ответ №1:
-
*(arr i) = malloc(1024 * sizeof(char));
Для i-й строки выделяется 1024
char
секунды, потому что известна максимальная длина строки*(arr i) = realloc(*(arr i), strlen(*(arr i)) 1);
в то время как здесь он изменяет размер блока, чтобы точно соответствовать размеру строки, которую я
-
Поскольку во входных данных указано одно слово
scanf
, будет достаточно