【问题标题】:Why memset sockaddr_in to 0为什么 memset sockaddr_in 为 0
【发布时间】:2014-08-31 05:12:36
【问题描述】:

有没有明确的指南说我们必须将 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] 成员用于填充,应该设置为零,但为什么要将其余部分归零。尤其是当它们在大多数情况下在接下来的几行声明中被初始化时。甚至关于 beej 编程指南 said it is not mandatory to zero them out anymore 的 sin_zero 成员。我一直在寻找解释,但没有任何结果。这个stack overflow question 对初始化本身有一些不同的建议,但没有解释为什么需要归零。

这是一种传统做法还是我错过了什么真正的原因?任何参考表示赞赏。

【问题讨论】:

  • 它确保您不会得到依赖于垃圾值的代码。这样的代码会产生海森bug等难以调试的bug。
  • 或者只是 struct sockaddr_in foo = { AF_INET, htons(1025) }; - 更短,并且仅将剩余成员归零。

标签: c++ sockets network-programming memset


【解决方案1】:

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

如果您绝对确定要设置所有成员,那么这不是绝对必要的,尽管如果您忘记初始化某些内容,它可以帮助更早发现错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 2013-03-14
    • 1970-01-01
    • 2021-05-18
    • 2018-05-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多