C: inet_ntop возвращаемое значение позиции? - PullRequest
0 голосов
/ 26 июня 2019

Я рассматриваю документацию inet_ntop. Обычно операции компоновщика строк в C возвращают либо указатель на конец строки, либо целое число, указывающее длину записанной строки.

Документация inet_ntop гласит весьма неоднозначно:

On success, inet_ntop() returns a non-null pointer to dst.  NULL is 
returned if there was an error, with the errno set to indicate the 
error.

Здесь есть две проблемы:

  1. Завершение нулевой строки: неясно, нужно ли мне добавлять разделитель нулевой строки во время выделения памяти, где inet_ntop печатает при компиляции в порядке 3 или более

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


Что возвращает inet_ntop

Ответы [ 3 ]

2 голосов
/ 26 июня 2019

Возвращает const char *, и поскольку параметр dst должен быть действительным объектом (вы не можете передать NULL как dst), нет необходимости создавать промежуточный указатель для возврата статусафункция.

2 голосов
/ 26 июня 2019

Это совершенно ясно для меня, но, возможно, вам нужно применить некоторую «добрую волю», чтобы получить это:

  1. Это не строка в C, если она не завершена, поэтому, конечно, результат завершается.
  2. dst является входным аргументом, даже если он немного странно написан, «указатель на dst» не может быть «указателем на dst плюс что-то».

Конечно, вы также можете прочитать реализацию , чтобы увидеть, что происходит. Последний оператор для «счастливого пути» (без переполнения буфера) для вариантов IPv4 и v6:

return strcpy(dst, tmp);

Который мгновенно сообщает вам, что dst получает завершенную строку и что dst возвращается.

0 голосов
/ 26 июня 2019

Документация inet_pton() :

...

1010 * СИНТАКСИС *

#include <arpa/inet.h>

const char *inet_ntop(int af, const void *restrict src,
       char *restrict dst, socklen_t size);

...

ОПИСАНИЕ

Функция inet_ntop() преобразует числовой адрес в текст Строка подходит для презентации. Аргумент af должен указывать семья по адресу. Это может быть AF_INET или AF_INET6. Src аргумент указывает на буфер, содержащий адрес IPv4, если af аргумент AF_INET или адрес IPv6, если аргумент af AF_INET6; адрес должен быть в сетевом порядке байтов. dst аргумент указывает на буфер, где функция хранит результирующий текстовая строка; оно не должно быть NULL. Аргумент размера указывает размер этого буфера, который должен быть достаточно большим, чтобы вместить текст строка (INET_ADDRSTRLEN символов для IPv4, INET6_ADDRSTRLEN символы для IPv6).

...

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция inet_ntop() должна возвращать указатель на буфер содержащий текстовую строку, если преобразование выполнено успешно, и NULL в противном случае установите errno для указания ошибки.

...

ОШИБКА

Функции inet_ntop() и inet_pton() не будут работать, если:

[EAFNOSUPPORT] Недопустимый аргумент af.

[ENOSPC] Размер результирующего буфера inet_ntop() недостаточен.

И определение "строки" :

3.92 Строка символов

Непрерывная последовательность символов, оканчивающаяся на первый нулевой байт.

Учитывая это, ответ на

  1. Завершение нулевой строки: неясно, нужно ли мне добавлять разделитель нулевой строки во время выделения памяти, когда inet_ntop печатает при компиляции в порядке 3 или более

должно быть ясно. Строка по определению включает нулевой байт. inet_pton() возвращает указатель на буфер, который содержит такую ​​строку. Никакого добавления нулевого байта не требуется.

И ответ на

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

дано стандартом C в 6.3.2.3 Указатели , пункт 7 :

... Когда указатель на объект преобразуется в указатель на тип символа, результат указывает на младший адресуемый байт объекта.

Таким образом, «указатель на буфер, содержащий текстовую строку, если преобразование выполнено успешно», возвращаемый inet_ntop(), указывает на первый байт в строке.

...