1

我正在学习套接字编程,我遇到了这段代码。

struct addrinfo hints, *res, *p;
int status;
char ipstr[INET6_ADDRSTRLEN];

if (argc != 2) {
    fprintf(stderr,"usage: showip hostname\n");
    return 1;
}

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version
hints.ai_socktype = SOCK_STREAM;

if ((status = getaddrinfo(argv[1], NULL, &hints, &res)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
    return 2;
}

除了一个,我都明白。为什么这段代码 memset'ed 结构提示而不是 *res 和 *p?

4

4 回答 4

3

res指针将由getaddrinfo函数填充,因此不需要初始化为零。hints另一方面需要初始化,因此将整个结构设置为零,然后设置需要设置的仅有的两个字段。

由于您未p在代码中使用 - 我无法对此发表评论。

于 2012-03-22T10:23:11.283 回答
1

getaddrinfo的描述指出

getaddrinfo() 函数分配和初始化一个 addrinfo 结构的链表,每个匹配节点和服务的网络地址一个,受提示施加的任何限制,并返回一个指向 res 中列表开头的指针。

这意味着您不需要任何其他信息hints(否则该函数可能会产生不需要的输出)。此外,函数的“真实”结果在 中返回res,这意味着 的当前内容res被覆盖,因此您并不真正关心函数调用之前那里的内容(只要您不打算在以下情况下解释它)功能失败)。

由于addrinfo在声明该类型的变量时未以任何方式初始化 struct (like) 的成员,因此hints最初包含“垃圾”——无论何时发生在分配变量的内存中。因此,代码调用memset以简单/快速的方式将所有成员清零(而不是将成员变量逐个设置为零)。

于 2012-03-22T10:35:58.010 回答
0

它不应该因为你只对全 0 进行 memset 提示。res 和 p 也只是指针,在 memset 调用时不定位到任何位置。

这是预期的行为。让我知道您的例外情况,我将能够为您提供更好的帮助。

于 2012-03-22T10:25:01.373 回答
0

为什么这段代码 memset'ed 结构提示而不是 *res 和 *p?

因为,您只调用了一次 memset,并且只将 &hints 作为参数传递给该 memset。

memset(&hints, 0, sizeof hints);

如果你想 memset *res & *p,首先你需要为它们分配内存,因为它们只是指针,然后你需要通过将它们作为参数传递来为它们中的每一个单独调用 memset。

于 2012-03-22T10:25:30.203 回答