Если я возьму строку адреса IPv4 максимальной длины: 255.255.255.255, то размер, который мне нужен: 3 для каждого октета, 3 для точек и 1 для нулевого терминатора. 3 * 4 + 3 + 1 = 16.
Так зачем нам нужны эти 2 дополнительных символа?
Ваши вычисления верны. Для хранения адресно-точечной строки с точками, полученной с помощью inet_ntoa()
, требуется только шестнадцать байтов, включая ее терминатор. Соответствующая документация и спецификации определяют текущий формат, по крайней мере, еще в POSIX.1 2004, и, насколько мне известно, не было выпущено ни одной реализации, которая бы производила какой-либо другой формат, поэтому мы можем только догадываться о том, почему некоторые реализации предоставляют дополнительное пространство Возможности включают, но не ограничиваются,
- опечаткой или неправильным расчетом;
- буфер использовался (может быть, все еще используется) для более чем одной цели, а для других целей требуется пара больше байтов;
- алгоритм, используемый некоторой реализацией для форматирования результата, выиграл от наличия пары дополнительных байтов для работы;
- было предоставлено лишних байтов для пространства пробелов, чтобы смягчить последствия гипотетические ошибки.
То, что одни и те же дополнительные байты наблюдаются сегодня во многих реализациях, может поддерживать альтернативу многоцелевого буфера, но это наблюдение также согласуется с любым объяснением тех байтов, которые появляются в некоторой ранней реализации, возможно BSD, и распространяется оттуда ко многим последующим. Я склонен поддержать последнее объяснение.