【问题标题】:C: inet_ntop return value position?C:inet_ntop 返回值的位置?
【发布时间】:2019-11-08 12:40:31
【问题描述】:

我正在查看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. 空字符串终止:不清楚是否需要在以 3 或更多顺序编译时打印 inet_ntop 的内存分配中添加空字符串分隔符

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


inet_ntop 返回什么?

【问题讨论】:

    标签: c libpcap inet inet-ntop


    【解决方案1】:

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

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

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

    return strcpy(dst, tmp);
    

    这会立即告诉您 dst 正在接收终止的字符串,并且 dst 已返回。

    【讨论】:

      【解决方案2】:

      它返回const char *,并且由于dst参数必须是一个有效的对象(你不能将NULL作为dst传递)所以不需要创建一个中间指针来返回状态功能。

      【讨论】:

      • 返回const char *
      【解决方案3】:

      inet_pton() documentation:

      ...

      概要

      #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。源代码 如果af,则参数指向一个保存 IPv4 地址的缓冲区 参数是 AF_INET,或者如果 af 参数是 IPv6 地址 AF_INET6;地址必须按网络字节顺序排列。 dst 参数指向函数存储结果的缓冲区 文本字符串;它不应是NULL。大小参数指定 此缓冲区的大小,应足以容纳文本 字符串(INET_ADDRSTRLEN IPv4 字符,INET6_ADDRSTRLEN IPv6 的字符)。

      ...

      返回值

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

      ...

      错误

      如果出现以下情况,inet_ntop()inet_pton() 函数将失败:

      [EAFNOSUPPORT] af 参数无效。

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

      还有the definition of a "string"

      3.92 字符串

      一个连续的字符序列,以 第一个空字节。

      鉴于此,答案

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

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

      还有答案

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

      6.3.2.3 Pointers, paragraph 7 中的 C 标准给出:

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

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

      【讨论】:

      • 你没有处理太多损坏的 C 代码,我接受。尽管如此,我看到这个问题会触发堆栈溢出“锤子会话”
      • 已标记。我明白了,我保证:字符串是一个空分隔的字符数组。但这些并不总是由人类用户或函数分隔为空。我不是说我做。但是看:我们用计算机语言编写计算机语言,因为英语不精确。你否认这个简单的事实,并以一个公认的答案猛烈抨击一个问题。
      • 标准是为实施者编写的,而不是为用户编写的。 inet_ntop 手册页之类的参考文档是为已经了解该语言的所有来龙去脉并且只需要提醒的人编写的。向尚未完全理解 C 的人引用此类文档,不仅无法回答他们的问题,而且还告诉他们不完全理解 C 的人在这里不受欢迎。请不要再这样做了。
      • @donlan 不,你不要明白了:字符串是一个空分隔的字符数组。但这些并不总是以空字符分隔。 如果它缺少空字符终止符,则它不是“字符串”。这里的英语不是不精确的,你是。
      • @zwol 标准是为实现者编写的 编写代码正在实现,标准是参考。 POSIX 标准比我认为的问题中引用的 Linux 手册页更清晰。我从 POSIX 中的inet_pton() 开始,引入了 POSIX 字符串定义,并从相关标准中简单直接地回答了他的问题。这是一个简单、直接的答案,说明了它的来源哪里。愿意解释一下有什么问题吗?
      猜你喜欢
      • 2016-07-13
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      相关资源
      最近更新 更多