对memset感到困惑

时间:2012-03-22 10:18:17

标签: c sockets networking struct memset

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

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的结构提示但不是* res和* p?

4 个答案:

答案 0 :(得分:3)

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

由于您未在代码中使用p,我无法对其进行评论。

答案 1 :(得分:1)

getaddrinfo的描述

  

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

这意味着您不会在hints中发出任何其他信息而非严格必要的信息(否则该函数可能会产生不需要的输出)。此外,函数的“真实”结果在res中返回,这意味着res的当前内容被覆盖,因此您不必关心函数调用之前的内容(如只要你不解释它,如果函数失败了。)

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

答案 2 :(得分:0)

它不应该因为你只对所有0的memset提示。 res和p也是指针在memset调用时不能定位到任何位置。

这是预期的行为。让我知道你的例外是什么,我将能够更好地帮助你。

答案 3 :(得分:0)

为什么这段代码会设置结构提示而不是* res和* p?

因为,您只调用一次memset并仅将&提示作为参数传递给该memset。

memset(&hints, 0, sizeof hints);

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