我查看了inet_ntoalike this和this 的实现,
我想知道为什么他们都分配了一个 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;
}
Run Code Online (Sandbox Code Playgroud)
如果我采用最大长度的 IPv4 地址字符串:255.255.255.255,我需要的大小是:每个八位字节 3 个,点 3 个,空终止符 1 个。3*4+3+1 = 16。
那么为什么我们需要这两个额外的角色呢?
你的计算是正确的。存储由 生成的点分十进制地址字符串(inet_ntoa()包括其终止符)只需要十六个字节。相关文档和规范至少早在 POSIX.1 2004 就指定了当前格式,据我所知,还没有发布过产生任何其他格式的实现,因此我们只能推测为什么某些实现提供额外的空间。可能性包括但不一定限于
今天在许多实现中观察到的相同的额外字节可能支持多用途缓冲区替代方案,但该观察结果也与对某些早期实现(可能是 BSD)中出现的那些字节的任何解释一致,并从那里传播到许多后续实现。我倾向于支持后一种解释。