c - 为什么 inet_ntoa 中的缓冲区大小为 18?
问题描述
我查看了inet_ntoa
like 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;
}
解决方案
如果我采用最大长度的 IPv4 地址字符串:255.255.255.255,我需要的大小是:每个八位字节 3,点 3,空终止符 1。3*4+3+1 = 16。
那么为什么我们需要这两个额外的字符呢?
你的计算是正确的。只需要 16 个字节来存储由 产生的点分十进制地址字符串inet_ntoa()
,包括它的终止符。相关文档和规范至少早在 POSIX.1 2004 就指定了当前格式,据我所知,从未发布过任何其他格式的实现,因此我们只能推测为什么某些实现提供额外的空间。可能性包括但不一定限于
- 拼写错误或计算错误;
- 缓冲区被(也许仍然是)用于不止一件事,而其他用途需要更多字节;
- 一些实现用来格式化结果的算法得益于有几个额外的字节可以使用;
- 为 slop 空间提供了额外的字节,以减轻假设错误的影响。
今天在许多实现中观察到相同的额外字节可能支持多用途缓冲区替代方案,但这种观察也与对出现在某些早期实现中的那些字节的任何解释一致,可能是 BSD,并从那里传播到许多后续的. 我倾向于支持后一种解释。
推荐阅读
- react-native - React Native:警告:列表中的每个孩子都应该有一个唯一的“关键”道具
- flutter - 等待网络图像和 CircularProgressIndicator
- python - 将参数传递给本地存储的 bash 脚本,需要使用 Python Paramiko 在远程机器上执行
- jinja2 - 将字符串附加到数组并重新加入字符串
- visual-studio-code - 如何在 VScode 中激活智能感知?(C#)
- postgresql - 如何使用 postgres 计算客户重新预订率
- sql - 带有行号的 Oracle Sql Delete 引发错误 ORA-00904:“RN”:标识符无效
- javascript - 将 12 件套产品添加到购物车
- java - 测试一个集合是否只有一个元素与谓词匹配
- svelte - 在 https 上运行 svelte dev