检测空终止向量的最后一个元素
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++;
}
在使用套接字的文档中有对 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++;
}