是否有任何明确的指南说我们必须将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
};
每当我查看真实的代码或示例或书籍时,它总是具有类似于以下的代码结构:
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);
我知道有些消息来源说char sin_zero[8]
成员用于填充,应该设置为零,但为什么要将其余部分归零。特别是在大多数情况下,在接下来的几行宣言中对它们进行初始化。甚至关于sin_zero成员beej编程指南said it is not mandatory to zero them out anymore。我已经搜索了一个解释,但没有提到任何重点。这个stack overflow question对初始化本身有一些不同的建议,但没有解释为什么归零是必要的。
这是遗产还是我错过了一些真正的原因?任何参考都表示赞赏。
答案 0 :(得分:6)
将其视为默认构造函数,即将数据初始化为已知值(在本例中为0)。这有助于在使用POD时缓解与未初始化数据相关的问题,例如忘记设置成员,尽管memset
并非真正必要,您可以使用sockaddr_in foo{};
对结构进行值初始化(顺便提一下)这也可以在幕后产生更好的汇编代码,因为编译器可以movq 0
而不是调用memset
而不是调用{{1}},而不是在99%的情况下它会有很大的不同。)
如果您完全确定要设置所有成员,那么它并不是绝对必要的,但如果您忘记初始化某些内容,它可以帮助更早地发现错误。