【发布时间】:2020-02-25 08:56:49
【问题描述】:
我查看了inet_ntoa 的实现,例如this 和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;
}
【问题讨论】:
-
因为
inet_ntoa正常工作所需的最大字节数是 16 个字节。这 2 个额外的字节未被使用,从未用于任何事情。 -
那么为什么要声明额外的 2 个字节呢?
-
@Yanbir 作者也没有,但他们从原始错误的作者那里得到了货物。只有 musl 的作者才能算数。
-
@AdrianMole 如果“基础”问题是根本原因,那么它至少应该是 20。这 18 允许四个组件中的两个多一个字符,在任何基础上都没有意义.
标签: c networking