Почему размер буфера в inet_ntoa 18? - PullRequest
5 голосов
/ 25 февраля 2020

Я смотрел на реализации inet_ntoa как это и это ,

Мне интересно, почему они оба выделяют буфер из 18 символов.

Если я возьму строку адреса IPv4 максимальной длины: 255.255.255.255 мне нужен размер: 3 для каждого октета, 3 для точек и 1 для нулевого терминатора. 3 * 4 + 3 + 1 = 16.

Так зачем нам нужны эти 2 дополнительных символа?

Реализация inet_ntoa из первой ссылки:

static __thread char buffer[18];

char *
inet_ntoa (struct in_addr in)
{
  unsigned char *bytes = (unsigned char *) ∈
  __snprintf (buffer, sizeof (buffer), "%d.%d.%d.%d",
              bytes[0], bytes[1], bytes[2], bytes[3]);
  return buffer;
}

1 Ответ

4 голосов
/ 25 февраля 2020

Если я возьму строку адреса IPv4 максимальной длины: 255.255.255.255, то размер, который мне нужен: 3 для каждого октета, 3 для точек и 1 для нулевого терминатора. 3 * 4 + 3 + 1 = 16.

Так зачем нам нужны эти 2 дополнительных символа?

Ваши вычисления верны. Для хранения адресно-точечной строки с точками, полученной с помощью inet_ntoa(), требуется только шестнадцать байтов, включая ее терминатор. Соответствующая документация и спецификации определяют текущий формат, по крайней мере, еще в POSIX.1 2004, и, насколько мне известно, не было выпущено ни одной реализации, которая бы производила какой-либо другой формат, поэтому мы можем только догадываться о том, почему некоторые реализации предоставляют дополнительное пространство Возможности включают, но не ограничиваются,

  • опечаткой или неправильным расчетом;
  • буфер использовался (может быть, все еще используется) для более чем одной цели, а для других целей требуется пара больше байтов;
  • алгоритм, используемый некоторой реализацией для форматирования результата, выиграл от наличия пары дополнительных байтов для работы;
  • было предоставлено лишних байтов для пространства пробелов, чтобы смягчить последствия гипотетические ошибки.

То, что одни и те же дополнительные байты наблюдаются сегодня во многих реализациях, может поддерживать альтернативу многоцелевого буфера, но это наблюдение также согласуется с любым объяснением тех байтов, которые появляются в некоторой ранней реализации, возможно BSD, и распространяется оттуда ко многим последующим. Я склонен поддержать последнее объяснение.

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