c - struct epoll_event memset 还是没有 memset?
问题描述
在网上浏览代码时,经常会看到这样的片段:
struct epoll_event event;
memset(&event, 0, sizeof(event));
如果事件被完整填写,这种模式对我来说似乎是不必要的,但它很普遍。也许是考虑到结构未来可能发生的变化?
解决方案
这肯定只是糟糕的复制粘贴编码。手册页epoll
没有记录对epoll_event
结构进行零初始化的任何需要,并且在示例中也没有这样做。未来对结构的更改似乎是不可能的(ABI),但如果是这样,合同显然会是与您请求的结构无关的任何部分都events
将被忽略(甚至不会读取,因为调用者可能正在传递一个指向不超出原始定义的存储的指针)。
此外,一般来说,当结构应该被零初始化时,它充其量是没有意义的,最坏的情况是不正确/不可移植memset
,因为零表示不一定是零值(对于指针和浮点类型)。如今,这种普遍性主要是历史上的好奇心,与 Linux 特定接口无关epoll
,但它也出现mbstate_t
在完全通用的 C 中,并且需要零初始化才能正确使用相关接口。对需要零值而不是全零字节表示的事物进行零初始化的正确方法是使用通用零初始化器{ 0 }
.
推荐阅读
- c++ - 迭代在 cicle C++ 期间改变大小的无序集
- javascript - 在 add_action WooCommerce 中运行 JS 函数
- validation - Kotlin 数据类和 Bean 验证:Double 字段上的 @NotNull 不起作用
- python - 将列表设置为字典值会导致 TypeError: unhashable type: 'list'
- django - 如何建立一个 django 模型来存储 twitter 对话?
- django - Python MongoDB ReferenceError:弱引用对象不再存在
- javascript - 为什么在函数中重新声明标识符会屏蔽同名参数?
- javascript - 如何修改嵌套对象的属性?
- terraform - 运行 terraform 输出时无法获取输出
- java - cloudrun 因 find_vma 失败而失败