为什么memset sockaddr_in为0

jaz*_*man 10 c++ sockets network-programming memset

是否有任何明确的指南说我们必须将sockaddr_in结构初始化为零,原因是什么?

// IPv4 AF_INET sockets:
struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};
Run Code Online (Sandbox Code Playgroud)

每当我查看真实的代码或示例或书籍时,它总是具有类似于以下的代码结构:

struct sockaddr_in foo;
memset(&foo, 0, sizeof(foo)); 
foo.sin_port = htons(1025);
foo.sin_family = AF_INET;
inet_pton(AF_INET, "10.0.0.1", &foo.sin_addr);
Run Code Online (Sandbox Code Playgroud)

我知道有些消息来源说char sin_zero[8]会员在那里填充,应该设置为零,但为什么要将其余部分归零.特别是在大多数情况下,在接下来的几行声明中对它们进行初始化.即使是sin_zero成员,beej编程指南也表示不再强制将它们归零.我已经搜索了一个解释,但没有提到任何重点.这个堆栈溢出问题对初始化本身有一些不同的建议,但没有解释为什么归零是必要的.

这是遗留的做法还是有一些我错过的真正原因?任何参考表示赞赏.

use*_*267 6

可以将其视为默认构造函数,即将数据初始化为已知值(在本例中为0).这有助于在使用POD时缓解与非初始化数据相关的问题,例如忘记设置成员,虽然memset不是真的有必要,并且您可以使用值初始化结构sockaddr_in foo{};(顺便说一下,这也会在后台产生更好的汇编代码)因为编译器可以movq 0一切而不是调用memset,而不是它在99%的情况下会有很大的不同).

如果您完全确定要设置所有成员,那么它并不是绝对必要的,尽管如果您忘记初始化某些内容它可以帮助更早地捕获错误.