我正在查看inet_ntop
文档。通常,C
中的字符串生成器操作将返回一个指向字符串末尾的指针,或者返回一个指示所写字符串长度的整数。
inet_ntop
的文档含糊不清:
On success, inet_ntop() returns a non-null pointer to dst. NULL is
returned if there was an error, with the errno set to indicate the
error.
这里有两个问题:
空字符串终止:尚不清楚在以{3}或更高的顺序编译时inet_ntop
正在打印的内存分配中是否需要在整个内存分配中添加空字符串定界符
我不知道函数的输出是否返回指向最后写入字符或第一个写入字符的指针。
inet_ntop
返回什么?
答案 0 :(得分:2)
对我来说很清楚,但是也许您需要运用一些“善意”才能得到它:
dst
是一个输入参数,即使有点怪异地写到“指向dst
的指针也不能是指向dst
的指针和其他内容”。您当然也可以read an implementation来查看发生了什么。对于IPv4和v6变体的“快乐路径”(没有缓冲区溢出)的最后一条语句是:
return strcpy(dst, tmp);
立即告诉您dst
正在接收终止的字符串,并且返回了dst
。
答案 1 :(得分:2)
它返回const char *
,并且由于必须将dst
参数作为有效对象(您不能将NULL
作为dst
进行传递),因此无需创建返回功能状态的中间指针。
答案 2 :(得分:0)
...
简介
#include <arpa/inet.h> const char *inet_ntop(int af, const void *restrict src, char *restrict dst, socklen_t size);
...
描述
inet_ntop()
函数应将数字地址转换为文本 适合演示的字符串。 af参数应指定 地址的家庭。这可以是AF_INET
或AF_INET6
。 src 如果af
,则参数指向保存IPv4地址的缓冲区 参数是AF_INET
,如果af
参数是AF_INET6
;地址必须按网络字节顺序。dst
参数指向函数存储结果的缓冲区 文字字串;它不能是NULL
。 size参数指定 此缓冲区的大小,应足够大以容纳文本 字符串(用于IPv4的INET_ADDRSTRLEN
个字符,INET6_ADDRSTRLEN
IPv6字符)。...
返回值
inet_ntop()
函数应返回一个指向缓冲区的指针 如果转换成功,则包含文本字符串,以及NULL
否则,请设置errno
来指示错误。...
错误
在以下情况下,
inet_ntop()
和inet_pton()
函数将失败:[{
EAFNOSUPPORT
]af
参数无效。[{
ENOSPC
]inet_ntop()
结果缓冲区的大小不足。
还有the definition of a "string":
3.92字符串
一个连续的字符序列,由(包括)终止 第一个空字节。
鉴于此,答案
- 空字符串终止:尚不清楚在以3或更高的顺序编译时inet_ntop正在打印的内存分配中是否需要在整个内存分配中添加空字符串定界符
应该清楚。 根据定义的字符串包含空字节。 inet_pton()
返回一个指向包含此类字符串的缓冲区的指针。无需添加空字节。
答案
- 我不知道函数的输出是否返回指向最后写入的字符或第一个写入的字符的指针。
由6.3.2.3 Pointers, paragraph 7中的C标准给出:
...将对象的指针转换为字符类型的指针时,结果指向该对象的最低寻址字节。
因此,inet_ntop()
返回的“如果转换成功则指向包含文本字符串的缓冲区的指针”指向字符串中的第一个字节。