Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对memset感到困惑_C_Sockets_Networking_Struct_Memset - Fatal编程技术网

C 对memset感到困惑

C 对memset感到困惑,c,sockets,networking,struct,memset,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

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

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;
}

除了一个我都懂。为什么这段代码只保留了结构提示,而不保留*res和*p

函数将填充
res
指针,因此不需要用零初始化<另一方面,代码>提示需要初始化,因此将整个结构设置为零,然后只设置需要设置的两个字段


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

函数将填充
res
指针,因此不需要将其初始化为零<另一方面,代码>提示需要初始化,因此将整个结构设置为零,然后只设置需要设置的两个字段


由于您没有在代码中使用
p
,因此我无法对此进行评论。

不应该这样做,因为您只将提示设置为所有0。此外,res和p只是指针,在memset调用时不指向任何位置


这是预期的行为。请告诉我您的例外情况,我将能够更好地帮助您。

不应该这样做,因为您只需将提示设置为所有0。此外,res和p只是指针,在memset调用时不指向任何位置


这是预期的行为。请告诉我您的异常情况,我将能够更好地帮助您。

为什么此代码只保留了结构提示而不保留*res和*p

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

memset(&hints, 0, sizeof hints);

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

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

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

memset(&hints, 0, sizeof hints);
如果您想要memset*res&*p,首先您需要为它们分配内存,因为它们只是指针,然后您需要通过将它们作为参数传递,分别为它们中的每一个调用memset。

函数的作用是:分配并初始化一个addrinfo结构的链表,每个与节点和服务匹配的网络地址对应一个,并根据提示施加的任何限制,返回一个指向列表开头的指针

这意味着您在
提示
中不需要任何严格必需的信息(否则函数可能会产生不需要的输出)。此外,函数的“真实”结果将在
res
中返回,这意味着
res
的当前内容将被覆盖,因此您并不真正关心函数调用之前的内容(只要在函数失败时您不打算解释它)

由于结构的成员(如
addrinfo
)在声明该类型的变量时不会以任何方式初始化,
hints
最初包含“垃圾”――无论在分配变量的内存中发生了什么。因此,代码调用
memset
以轻松/快速的方式将所有成员归零(与逐个将成员变量设置为零相反)。

函数的作用是:分配并初始化一个addrinfo结构的链表,每个与节点和服务匹配的网络地址对应一个,并根据提示施加的任何限制,返回一个指向列表开头的指针

这意味着您在
提示
中不需要任何严格必需的信息(否则函数可能会产生不需要的输出)。此外,函数的“真实”结果将在
res
中返回,这意味着
res
的当前内容将被覆盖,因此您并不真正关心函数调用之前的内容(只要在函数失败时您不打算解释它)


由于结构的成员(如
addrinfo
)在声明该类型的变量时不会以任何方式初始化,
hints
最初包含“垃圾”――无论在分配变量的内存中发生了什么。因此,代码调用
memset
以轻松/快速的方式将所有成员归零(与逐个将成员变量设置为零相反).

更好的方式是初始化
提示
而不是调用
memset
。更好的方式是初始化
提示
而不是调用
memset
。因此我可以使用memset*res,但是它没有意义,因为getaddrinfo无论如何都会覆盖它?你不能使用memset
*res
,因为指针无效(包含“垃圾”,因为它尚未初始化-因此指向无效的“对象”)。您可以将指针本身设置为memset(
res
),但是如果您想这样做的话,也可以很容易地为指针指定零(
res=0;
)。您是对的,函数调用将在返回时为
res
分配一个新值澄清:
res
的类型是
struct addrinfo*
(指向addrinfo结构的指针),
*res
的类型是
struct addrinfo
(结构本身,而不是指针),因此我可以memset*res,但是它没有意义,因为getaddrinfo无论如何都会覆盖它?您不能memset
*res
,因为指针无效(包含“垃圾”,因为它尚未初始化-因此指向无效的“对象”)。您可以将指针本身设置为memset(
res
),但是如果您想这样做的话,也可以很容易地为指针指定零(
res=0;
)。您是对的,函数调用将在返回时为
res
分配一个新值澄清:
res
的类型是
struct addrinfo*
(指针指向