-1

我正在查看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.

这里有两个问题:

  1. 空字符串终止:不清楚是否需要在整个内存分配中添加空字符串分隔符,inet_ntop在以 3 或更多顺序编译时打印在哪里

  2. 我不知道函数的输出是返回指向最后写入字符的指针,还是第一个写入字符的指针。


返回什么inet_ntop

4

3 回答 3

2

它返回const char *,并且由于dst参数必须是有效对象(您不能传递NULLas dst),因此无需创建中间指针来返回函数的状态。

于 2019-06-26T14:28:43.323 回答
2

这对我来说很清楚,但也许你需要应用一些“善意”来获得它:

  1. 如果它没有被终止,它就不是 C 中的字符串,所以结果当然会被终止。
  2. dst是一个输入参数,即使它有点奇怪地写成“指向”的指针dst也不能是“指向dst加号的指针”。

当然,您也可以阅读实现以了解发生了什么。IPv4 和 v6 变体的“快乐路径”(无缓冲区溢出)的最后一条语句是:

return strcpy(dst, tmp);

它立即告诉您dst正在接收终止的字符串,然后dst返回。

于 2019-06-26T14:23:11.040 回答
0

inet_pton()文档:_

...

概要

#include <arpa/inet.h>

const char *inet_ntop(int af, const void *restrict src,
       char *restrict dst, socklen_t size);

...

描述

inet_ntop()函数应将数字地址转换为适合表示的文本字符串。af 参数应指定地址的族。这可以是AF_INETAF_INET6。如果参数是 , src 参数指向一个保存 IPv4 地址的缓冲区,如果af 参数是, 则指向AF_INET一个 IPv6 地址;地址必须按网络字节顺序排列。 参数指向函数存储结果文本字符串的缓冲区;不应该。size 参数指定这个缓冲区的大小,它应该足够大以容纳文本字符串(对于 IPv4 的 字符,对于 IPv6 的字符)。afAF_INET6dstNULLINET_ADDRSTRLENINET6_ADDRSTRLEN

...

返回值

如果转换成功,则该inet_ntop()函数应返回指向包含文本字符串的缓冲区的指针,NULL 否则,并设置errno为指示错误。

...

错误

inet_ntop()和功能将在inet_pton()以下情况下失败:

[ EAFNOSUPPORT]af参数无效。

[ ENOSPC]inet_ntop()结果缓冲区的大小不足。

以及“字符串”的定义

3.92 字符串

由第一个空字节终止并包括第一个空字节的连续字符序列。

鉴于此,答案

  1. 空字符串终止:不清楚是否需要在以 3 或更多顺序编译时 inet_ntop 正在打印的内存分配中添加空字符串分隔符

应该清楚。根据定义,字符串包括空字节。 inet_pton()返回指向包含此类字符串的缓冲区的指针。不需要添加空字节。

和答案

  1. 我不知道函数的输出是返回一个指向最后写入字符的指针,还是第一个写入字符的指针。

由 C 标准在6.3.2.3 指针第 7 段中给出:

...当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。

因此,“如果转换成功,则指向包含文本字符串的缓冲区的指针”指向字符串inet_ntop() 中的第一个字节。

于 2019-06-26T14:51:20.167 回答