gpt4 book ai didi

c - 为什么 inet_ntoa 中的缓冲区大小是 18?

转载 作者:行者123 更新时间:2023-12-03 16:36:45 27 4
gpt4 key购买 nike

我查看了 inet_ntoa 的实现喜欢 thisthis ,

我想知道为什么他们都分配了一个 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;
}

最佳答案

If I take the maximum length IPv4 address string: 255.255.255.255 the size that I need is: 3 for each octet, 3 for dots and 1 for the null terminator. 3*4+3+1 = 16.

So why do we need those 2 extra characters?



你的计算是正确的。存储 inet_ntoa() 产生的点分十进制地址串只需要 16 个字节。 ,包括它的终止符。相关文档和规范至少早在 POSIX.1 2004 就指定了当前格式,据我所知,还没有发布产生任何其他格式的实现,因此我们只能推测为什么某些实现提供额外的空间。可能性包括但不限于
  • 打字错误或计算错误;
  • 缓冲区被(可能仍然)用于不止一件事,而其他用途需要更多字节;
  • 某些实现用于格式化结果的算法得益于有几个额外的字节可以使用;
  • 为 slop 空间提供了额外的字节,以减轻假设错误的影响。

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

    关于c - 为什么 inet_ntoa 中的缓冲区大小是 18?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60384468/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com