Преимущество использования двойного указателя (char **) по сравнению с (char *) в C? - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь реализовать функцию со следующим прототипом.

int     get_next_line(const int fd, char **line) .   

Первый параметр - это дескриптор файла , который будетиспользоваться для чтения.

Второй параметр - это адрес указателя для символа, который будет использоваться для сохранения прочитанной строки из файлового дескриптора.

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

[Отредактировано]: мы храним одну строку символов внутри '** line '.

Мой вопрос:

Почему стоит использовать ** line, а не просто * line, или почему нет?

1 Ответ

0 голосов
/ 15 октября 2018
int get_next_line(int fd, char **line);

Это полезная функция.Предположительно, он выделяет массив символов ориентировочно достаточного размера, считывает в него строку, перераспределяет и считывает остаток, если необходимо, а затем передает выделенную строку обратно, присваивая ее разыменованному второму аргументу (*line = allocated_string;).


int get_next_line(int fd, char *line);

Это чепуха.Нет способа написать get_next_line, который можно было бы использовать так же удаленно, как предыдущий.Он не может определить размер передаваемого ему массива символов и не может перераспределить этот массив.Единственный способ указать, что эта функция должна вести себя достаточно разумно, это потребовать, чтобы аргумент был массивом некоторого заранее определенного размера, указанного в другом месте.Это может быть полезно только в некоторых довольно узких контекстах.

Обратите внимание, что это не сразу очевидное наблюдение.Раньше язык C имел gets до 2011 года. Когда-то программисты были довольно небрежны.


int get_next_line(int fd, char *line, size_t size);

Это может быть несколько полезной функцией.Он может работать почти как стандартная функция read, за исключением того, что он не будет читать после первого символа конца строки.(Или как fgets для ручек Posix fike.) Конечно, пользователям нужно иметь дело со случаем, когда строка ввода длиннее, чем их массив.Предположительно get_next_line вернет номер, если отсканированные символы.


Примечание const int бесполезно в прототипах функций.Все стандартные функции указывают int в таких случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...