2016-07-07 43 views
2

我與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

回答

3

本地變量(以及本地結構變量的擴展成員)未初始化,因此嘗試讀取或寫入它們會導致未定義的行爲。

它恰好在這種情況下工作,但你不能依賴於此。

這就是說,這個結構的字段可能全是0,因爲它在main函數中是本地的,在啓動之前進程的內存可能被清除,並且該變量不會超出範圍程序的生命,所以它在堆棧上使用的空間不會被其他任何東西使用。

但是,這是一個不能依賴的實現細節。所以更好地顯式初始化所有值。

0

您不必分配變量,但我認爲最好練習到0null,並且當您的get這些變量有檢查點時。在我看來,它使你的代碼更加健壯,因爲你從來沒有被保護過,不會忘記實例化和什麼不是。

此外,不,默認情況下,如果沒有實例化一個值,那麼它不寫入內存。

+0

你是什麼意思通過實例化。當他聲明時,他在堆棧上實例化輸入。他不初始化它,但它與實例化不一樣。他可以使用他的變量,而不會對應用程序完整性造成任 – Logman

相關問題