我查看了的实现inet_ntoa
like this https://code.woboq.org/userspace/glibc/inet/inet_ntoa.c.html and this https://android.googlesource.com/platform/bionic/+/ics-mr0/libc/inet/inet_ntoa.c,
我想知道为什么他们都分配 18 个字符的缓冲区。
如果我采用最大长度的 IPv4 地址字符串:255.255.255.255
我需要的大小是:每个八位字节 3 个,点 3 个,空终止符 1 个。
3*4+3+1 = 16。
那么为什么我们需要这两个额外的角色呢?
The 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;
}
如果我取最大长度的IPv4地址字符串:255.255.255.255
我需要的大小是:每个八位字节 3 个,点 3 个,空值 1 个
终结者。 3*4+3+1 = 16。
那么为什么我们需要这两个额外的角色呢?
你的计算是正确的。只需要十六个字节来存储由以下命令生成的点分十进制地址字符串:inet_ntoa()
,包括其终止符。相关文档和规范至少早在 POSIX.1 2004 就指定了当前格式,据我所知,还没有发布过产生任何其他格式的实现,因此我们只能推测为什么某些实现提供额外的空间。可能性包括但不一定限于
- 拼写错误或计算错误;
- 缓冲区曾经(也许仍然)用于不止一件事,而其他用途则需要更多字节;
- 某些实现用来格式化结果的算法受益于有几个额外的字节可供使用;
- 为倾斜空间提供了额外的字节,以减轻假设错误的影响。
今天在许多实现中观察到的相同的额外字节可能支持多用途缓冲区替代方案,但该观察也与对某些早期实现(可能是 BSD)中出现的那些字节的任何解释一致,并从那里传播到许多后续实现。我倾向于支持后一种解释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)