在使用它之前memset一个结构是好的样式吗?

一旦我了解到信号,并有处理信号的列表。

有一个struct sigaction是第一个memset()的所有字节零与下面的行:

 memset(&sa, 0, sizeof(sa)); 

我不确定作者为什么使用这种方法。

正如你已经被告知的那样,试图从一个结构的未初始化成员读取值会导致未定义的行为。 这是无条件的坏。 因此,您必须确保所有字段在读取之前都已初始化。

如果你知道结构的所有元素,并且要明确地初始化它们,那么memset()就不是必须的了。 如果结构在你的控制之下,这可以被管理 – 你只需要记住,当你添加新的成员到结构中时,所有初始化发生的地方都会被更新。 如果你写了一个函数来做这件事(想想C ++构造函数的C类memset() ),那么可以省略memset() 。 如果你在很多地方设置临时值,如果结构发生变化,你可能会遇到问题。

在类似于struct sigaction的情况下,它来自于系统定义的头文件,不同的系统可以(并且不)向结构中添加额外的字段 – 超出了您计划初始化的字段。 请注意,POSIX仅指定必须存在的字段; 它并不决定这个领域的秩序,也没有要求在这个结构中没有其他的领域。 但是,除非用户指出这些成员已经初始化,通常带有一些明确的标志,否则使用结构的额外(非POSIX)元素的函数不应该这样做,所以您不应该遇到问题 – 但是更安全比抱歉。

因此,在不能控制结构的上下文中, memset()方法很容易理解:即使结构定义发生变化,也可保证将所有结构(即使是不知道的位)置零(增长)代码写入后。

您可以使用struct sigaction sa = { 0 }; 或者struct sigaction *sap = calloc(sizeof(*sap), 1); 将结构改为零 – 它部分取决于你使用的一组编译器选项(以及你使用的编译器的版本,例如GCC已经改变了它的行为)。

您可能希望查找宏,如POSIX标准中的PTHREAD_MUTEX_INITIALIZER ,或者您可能更愿意忽略它们的存在。

当你声明一个没有初始化的struct ,使用这个struct的任何一个成员都是未定义的行为,而不必先分配它们。 如果你想把零置入struct所有成员, memset提供了一个很好的方法来做到这一点。

如果你打算分配struct所有成员, memset的调用是不必要的。

未初始化的变量包含不确定的值,使用它们通常是程序失败的原因,因此在使用变量之前需要初始化变量。 但是,你不必使用memset来做到这一点,你可以使用初始化程序:

 struct sigaction sa = {0}; 

这样一个函数调用就被保存了,代码的读者很容易发现它被初始化了。