为什么inet_ntoa大小的缓冲区大小为18?

问题描述 投票:3回答:1

[我看了inet_ntoathis之类的this的实现,

我想知道为什么他们都分配18个字符的缓冲区。

如果我使用最大长度的IPv4地址字符串:255.255.255.255,则我需要的大小是:每个八位字节3个,点3个,空终止符1个。3 * 4 + 3 + 1 = 16。

所以为什么我们需要这两个额外的字符?

第一个链接中的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;
}
c networking
1个回答
0
投票

如果我使用最大长度的IPv4地址字符串:255.255.255.255,我需要的大小是:每个八位字节3个,点3个,空1个终结者。 3 * 4 + 3 + 1 = 16。

所以为什么我们需要这两个额外的字符?

您的计算是正确的。存储inet_ntoa()产生的点分十进制地址字符串(包括其终止符)仅需要16个字节。相关文档和规范至少在POSIX.1 2004上指定了当前格式,据我所知,从未发布过能够产生任何其他格式的实现,因此我们只能推测为什么某些实现提供了多余的空间。可能性包括但不限于

  • 拼写错误或计算错误;
  • 缓冲区被(可能仍然)用于一件事,而其他用途则需要更多字节;
  • 某种实现方式用于格式化结果的算法得益于使用几个额外的字节;
  • 为倾斜空间提供了额外的字节,以减轻假设错误的影响。

今天在许多实现中观察到相同的额外字节可能支持多用途缓冲区替代方案,但是该观察结果也与某些早期实现中可能出现的字节解释有关,可能是BSD,并从那里传播到许多随后的。我倾向于后一种解释。

© www.soinside.com 2019 - 2024. All rights reserved.