Перераспределение массива char (строки) порциями в C - PullRequest
0 голосов
/ 24 апреля 2020

Если я использую чанки для перераспределения памяти, скажем, для каждых десяти символов, которые я читаю из консоли с помощью функции getchar () в C, и подсчитываю каждый новый символ (позицию) с помощью counter ++, когда я закончу с Если я добавлю '\ 0' в последнюю позицию в массиве (отмечена счетчиком), я избавлюсь от избыточного выделенного пространства?

Например, если я хочу, чтобы вводом были имена и фамилии людей (новая строка представляет новую строку в массиве строк, над которыми я работаю): Анна Джонсон Марк Твен Гейб Майклсон

«Марк Твен» равен 9 символам, и я добавляю еще один для конца строки, я израсходовал все 10 мест из выделенного фрагмента. Но "Гейб Майклсон" - это 15 символов, если я добавлю '\ 0' на 16-й (считая с 1; или 15-й, считая с 0), буду ли я тратить (утечка ???) память, представленную 4 оставшимися неиспользованными местоположениями, или будет ли каждая строка в массиве строк иметь собственную длину без утечки / использования большего количества памяти, чем необходимо?

1 Ответ

3 голосов
/ 24 апреля 2020

Нет, добавление \0 не освобождает пространство и никак не влияет на остальную часть памяти. Действительно, если позже вам захочется добавить больше символов в строку, вы можете сделать это, вплоть до объема выделенного пространства.

Если вы действительно хотите освободить память в конце, единственный способ это realloc это к меньшему размеру. Однако для нескольких байтов это, вероятно, не очень поможет, так как malloc вряд ли сможет каким-либо образом использовать такой маленький блок, особенно с учетом того, что для каждого блока обычно много байтов. Поэтому, если размер вашего чанка относительно мал, лучше, вероятно, просто оставить его в покое и признать, что несколько байтов будут потрачены впустую - в большинстве случаев это должно быть незначительным.

На самом деле это не утечка, поскольку когда вы в конечном итоге free() строка "Гейб Майклсон", неиспользуемые байты в конце также будут освобождены.

...