检测空终止向量的最后一个元素

Detect the last element of a null terminated vector

在使用套接字的文档中有对 hostent 结构的描述:https://www.gnu.org/software/libc/manual/html_node/Host-Names.html#Host-Names

对于 h_addr_list 字段,它表示它是一个以空指针结尾的向量。
所以,我尝试做的是:

struct in_addr *addr = (struct in_addr *)hostent->h_addr_list[0];
while (addr != NULL) {
  // ...
  addr++;
}

我预计 addr 变量在到达向量中的最后一个元素时为 NULL,因为该元素应该是 NULL 指针。
但在实践中并没有发生。 addr 永远不会变成 NULL.

// hostent->h_addr_list contains 4 meaningful elements
struct in_addr *addr = (struct in_addr *)hostent->h_addr_list[0];
addr++;
addr++;
addr++;
addr == (struct in_addr *)hostent->h_addr_list[3]; // true
addr++;
// here I expected addr to be NULL to terminate the vector, but...
NULL == addr; // false!!!
addr == (struct in_addr *)hostent->h_addr_list[4]; // false

// just to check that it actually NULL terminated
NULL == hostent->h_addr_list[4]; // true
addr = (struct in_addr *)hostent->h_addr_list[4];
NULL == addr; // true

那么,为什么会这样呢?
我做错了什么?
谢谢。

它是一个指针向量。它是向量中的最后一个元素(指针)为 NULL,而不是该元素的地址。所以试试 while (*addr != NULL).

此外,您需要对指针的起始值进行强制转换 (struct in_addr *)(以使警告静音?)这强烈表明您的那部分代码是错误的。

查看文档:

char **h_addr_list

This is the vector of addresses for the host. (Recall that the host might be connected to multiple networks and have different addresses on each one.) The vector is terminated by a null pointer.

h_addr_list是指向char的指针,所以最后的pointer会是NULL,而不是指向指针本身的指针。否则它必须位于非常特定的内存中才能在一定数量的增量后为零!只是做:

char **addr_list = hostent->h_addr_list;
while (*addr_list != NULL) {
    // Now *addr points to a valid address
    struct in_addr *addr = (struct in_addr *)*addr_list;

    addr_list++;
}