2016-07-07 5 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;과 비슷한 것을 추가하는 것이 있습니까? 나는 기본적으로 구조체를 할당 할 때 메모리에 0을 써서이 변수들을 설정할 필요가 없다고 생각했다.

+13

"기본적으로 구조체를 할당 할 때 메모리에 0을 기록한다고 가정했습니다. - 나쁜 가정은 아닙니다. – user2357112

+1

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

+4

조금 더 명쾌하게하기 위해서 : 이것을하는 효과적인 방법은'INPUT input = {0}'이다. 모든 회원을 제로로하십시오. 모든 회원의 이름을 모두 알 필요는 없습니다. 좋은 것입니다. – MSalters

답변

3

로컬 변수 (및 로컬 구조체 변수의 확장 멤버)는 초기화되지 않으므로 읽기 또는 쓰기를 시도하면 정의되지 않은 동작이 발생합니다.

이 경우에는 제대로 작동하지만 그럴 수는 없습니다.

이 구조체의 필드는 main 함수의 로컬이기 때문에 아마 모두 0이었을 수 있습니다. 프로세스가 시작되기 전에 프로세스의 메모리가 지워졌고 변수가 범위를 벗어나지 않습니다. 프로그램의 수명은 스택에서 사용하는 공간이 다른 용도로 사용되지 않습니다.

다시 말하지만, 이것은 의존 할 수없는 구현 세부 사항입니다. 따라서 모든 값을 명시 적으로 초기화하는 것이 좋습니다.

0

변수를 지정할 필요는 없지만 0 또는 null으로 인스턴스화하고 get 변수를 사용할 때 체크 포인트가있는 것이 더 좋습니다. 그것은 여러분의 코드를 내 의견으로는 더 견고하게 만든다. 왜냐하면 여러분은 어떤 것을 인스턴스화했는지, 그리고 무엇이 그렇지 않은지 잊지 않도록 보호 해주지 않기 때문이다.

기본적으로 값이 인스턴스화되지 않으면 메모리에 기록되지 않습니다.

+0

인스턴스화 란 무엇을 의미합니까? 그는 선언 할 때 스택에'input'을 인스턴스화합니다. 그는 초기화하지 않지만 인스턴스화와 같지 않습니다. 그는 응용 프로그램 무결성에 대한 위험없이 변수를 사용할 수 있습니다. – Logman

관련 문제