为什么memset sockaddr_in为0 ?
Why memset sockaddr_in to 0
是否有明确的指南说,我们必须将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编程指南也说不再强制将它们归零。我一直在寻找一个解释,但什么也没找到。这个堆栈溢出问题对初始化本身有一些不同的建议,但没有解释为什么需要归零。
这是一个传统的做法还是有一些真正的原因我错过了?
将其视为默认构造函数,即它将数据初始化为已知值(在本例中为0)。这可以帮助缓解使用pod时与未初始化数据相关的问题,例如忘记设置成员,尽管memset
不是真正必要的,您可以使用sockaddr_in foo{};
对结构进行值初始化(顺便说一下,这也会在后台产生更好的汇编代码,因为编译器可以movq 0
所有内容而不是调用memset
,并不是说它在99%的情况下会产生很大的差异)。
如果你绝对确定要设置所有成员,那么它就不是严格必要的,尽管它可以帮助你在忘记初始化时更早地捕获错误。
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- C++中的memset函数工作不正常
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?