将所有值分配给结构有没有意义?

问题描述:

我与SendInput最近的实验,发现一切都按预期不会对结构将所有值分配给结构有没有意义?

#include <Windows.h> 

int main(int argc, char *argv[]) { 
    INPUT input; 

    input.type = 1; 
    input.ki.wVk = 0x41; 

    SendInput(1, &input, sizeof(INPUT)); 

    return EXIT_SUCCESS; 
} 

如果你看一看的INPUT结构,我使用的MSDN定义分配其他值,它有很多其他变量(除了我设置的唯一的变量typewVk)。

对于该结构中的所有其他字段,是否有类似于input.ki.dwExtraInfo = 0;的添加?我认为,默认情况下,当您分配结构时,它会将零写入内存,因此设置这些变量没有意义。

+13

“我认为,默认情况下,当您分配结构时,它会将零写入内存” - 错误的假设,并不成立。 – user2357112

+1

'INPUT input;'http://en.cppreference.com/w/cpp/language/default_initialization –

+4

为了更明确一点:执行此操作的有效方法是'INPUT input = {0}',其实际上零每个成员。你不需要知道所有成员的所有名字,这是好事。 – MSalters

本地变量(以及本地结构变量的扩展成员)未初始化,因此尝试读取或写入它们会导致未定义的行为。

它恰好在这种情况下工作,但你不能依赖于此。

这就是说,这个结构的字段可能全是0,因为它在main函数中是本地的,在启动之前进程的内存可能被清除,并且该变量不会超出范围程序的生命,所以它在堆栈上使用的空间不会被其他任何东西使用。

但是,这是一个不能依赖的实现细节。所以更好地显式初始化所有值。

您不必分配变量,但我认为最好练习到0null,并且当您的get这些变量有检查点时。在我看来,它使你的代码更加健壮,因为你从来没有被保护过,不会忘记实例化和什么不是。

此外,不,默认情况下,如果没有实例化一个值,那么它不写入内存。

+0

你是什么意思通过实例化。当他声明时,他在堆栈上实例化输入。他不初始化它,但它与实例化不一样。他可以使用他的变量,而不会对应用程序完整性造成任 – Logman