首页 > 解决方案 > struct epoll_event memset 还是没有 memset?

问题描述

在网上浏览代码时,经常会看到这样的片段:

struct epoll_event event;
memset(&event, 0, sizeof(event));

如果事件被完整填写,这种模式对我来说似乎是不必要的,但它很普遍。也许是考虑到结构未来可能发生的变化?

标签: clinuxepoll

解决方案


这肯定只是糟糕的复制粘贴编码。手册页epoll没有记录对epoll_event结构进行零初始化的任何需要,并且在示例中也没有这样做。未来对结构的更改似乎是不可能的(ABI),但如果是这样,合同显然会是与您请求的结构无关的任何部分都events将被忽略(甚至不会读取,因为调用者可能正在传递一个指向不超出原始定义的存储的指针)。

此外,一般来说,当结构应该被零初始化时,它充其量是没有意义的,最坏的情况是不正确/不可移植memset,因为零表示不一定是零值(对于指针和浮点类型)。如今,这种普遍性主要是历史上的好奇心,与 Linux 特定接口无关epoll,但它也出现mbstate_t在完全通用的 C 中,并且需要零初始化才能正确使用相关接口。对需要零值而不是全零字节表示的事物进行零初始化的正确方法是使用通用零初始化器{ 0 }.


推荐阅读