Зачем добавлять еще один блок памяти после динамического выделения памяти с помощью realloc()?

#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

У меня два вопроса:

  1. Для чего используется этот дополнительный блок памяти?
  2. Почему он используется scanf() для ввода строки, а не fgets() ? Разве это не хорошая практика?

Ответ №1:

  1. *(arr i) = malloc(1024 * sizeof(char));

    Для i-й строки выделяется 1024 char секунды, потому что известна максимальная длина строки

    *(arr i) = realloc(*(arr i), strlen(*(arr i)) 1);

    в то время как здесь он изменяет размер блока, чтобы точно соответствовать размеру строки, которую я

  2. Поскольку во входных данных указано одно слово scanf , будет достаточно