我正在研究套接字编程,我遇到了这段代码。
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?
答案 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。