C:inet\u ntop返回值位置?

C:inet\u ntop返回值位置?,c,libpcap,inet,inet-ntop,C,Libpcap,Inet,Inet Ntop,我正在审阅inet\u ntop文档。通常,C中的字符串生成器操作会返回指向字符串结尾的指针,或者返回指示所写入字符串长度的整数 inet\u 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. 这里有两个问题: 空字符串终止:不

我正在审阅
inet\u ntop
文档。通常,
C
中的字符串生成器操作会返回指向字符串结尾的指针,或者返回指示所写入字符串长度的整数

inet\u 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\u ntop
    正在打印

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



  • inet\u ntop
    返回什么?

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

  • 如果它没有终止,它在C中就不是字符串,因此结果当然是终止的
  • dst
    是一个输入参数,即使它写得有点奇怪,“指向
    dst
    的指针”也不能是“指向
    dst
    加上某些东西的指针”
  • 当然,你也可以看看发生了什么。IPv4和v6变体的“快乐路径”(无缓冲区溢出)的最后一条语句是:

    return strcpy(dst, tmp);
    

    它立即告诉您,
    dst
    正在接收一个终止的字符串,并且返回了
    dst

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

    简介

    #include <arpa/inet.h>
    
    const char *inet_ntop(int af, const void *restrict src,
           char *restrict dst, socklen_t size);
    
    #包括:

    3.92字符串

    一种连续的字符序列,由 第一个空字节

    鉴于此,答案是

  • 空字符串终止:不清楚是否需要在整个内存分配中添加空字符串分隔符,当以3或更多的顺序编译时,inet_ntop正在打印该内存分配
  • 应该很清楚。根据定义,字符串包含空字节
    inet\u pton()
    返回指向包含此类字符串的缓冲区的指针。不需要添加空字节

    答案是什么

  • 我不知道函数的输出是返回指向最后一个写入字符的指针,还是返回第一个写入字符的指针 由C标准给出,见:

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


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

    它返回
    const char*
    。我认为您没有太多处理坏的C代码。尽管如此,我看到这个问题将触发一个标记为“hammersession”的堆栈溢出。我明白了,我保证:字符串是一个空的字符数组。但是,人工用户或函数并不总是以null分隔。我不是说我做了。但是你看,我们用计算机语言写计算机语言,因为英语不精确。你否认了这个简单的事实,并用一个公认的答案回答了一个问题。标准是为实现者而不是用户编写的。像
    inet\u ntop
    manpage这样的参考文档是为那些已经了解该语言的所有细节并且只需要提醒的人编写的。引用这样的文档,对一个还不完全理解C的人来说,不仅不能回答他们的问题,还教会了他们不完全理解C的人在这里是不受欢迎的。请不要再这样做了。@donlan不,你不明白:字符串是一个空的delimetered字符数组。但它们并不总是以空分隔的。如果缺少空字符终止符,则它不是“字符串”。这里的英语不是不精确的,你是。@zwol标准是为编写代码的实现者编写的,这些标准是参考。POSIX标准比我在问题中引用的Linux手册页更清晰。我从POSIX中的
    inet\u pton()
    开始,引入POSIX字符串定义,并直接从相关标准简单地回答了他的问题。这是一个简单、直接的答案,从某种程度上说明了它的来源。想解释一下有什么不对吗?