나는 다음과 같은 코드를 사용할 수 라인 입력을했습니다 :루프에서 ReadConsole을 호출하여 스택이 손상되는 이유는 무엇입니까?
wchar_t cBuf;
while (1) {
/* Display Options */
do {
ReadConsole(hStdIn, &cBuf, 1, &dwNumRead, NULL);
} while (!iswdigit(cBuf));
putwchar(cBuf);
if (cBuf == L'0') break;
}
내가 프로그램을 실행하면 0을 누릅니다
DWORD dwConsoleMode;
GetConsoleMode(hStdIn, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
SetConsoleMode(hStdIn, dwConsoleMode);
은 그 때 나는 루프 ... 루프에서 ReadConsole를 호출하고 바로, 그것은 깔끔하게 존재합니다. 변수 'cBuf'주위에 스택 손상되었습니다 -
가 확인 실패 # 2 런타임이
을 : 나는 키의 무리를 누르면 프로그램이 그것과 충돌이있는 경우
는하지만, 다음, 0을 누릅니다.
왜 스택이 손상 될 수 있습니까? 코드는 간단하기 때문에 무엇이 잘못되었는지 알 수 없습니다. 내가 가진 문제를 재현 할 수
리틀 프로그램 :
당신은 당신이 그것을 실행 한 후 종류의 키보드를 반하게해야#include <windows.h>
#include <stdio.h>
int wmain(int argc, wchar_t *argv[])
{
DWORD dwNumRead;
wchar_t cBuf;
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
DWORD dwConsoleMode;
GetConsoleMode(hStdIn, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
SetConsoleMode(hStdIn, dwConsoleMode);
while (true)
{
wprintf(L"\nEnter option: ");
do {
ReadConsoleW(hStdIn, &cBuf, 1, &dwNumRead, NULL);
} while (!iswdigit(cBuf));
putwchar(cBuf);
if (cBuf == L'0') break;
}
return 0;
}
, 다음 0을 누르면, 그것은 스택 손상과 충돌합니다.
나는 또한 문제를 재현 할 수 없다. 몇 번 시도해보아야한다.
비어있는 새 콘솔 프로젝트를 만들고 해당 코드가있는 파일을 추가 한 후 Visual Studio 2010에서 실행하고있었습니다.
문제를 재현 할 수 없습니다. 이 문제를 전시 한 작지만 완전한 프로그램을 게시 할 수 있습니까? –
필자는'ReadConsoleW'의 리턴 값을 검사하고 필요할 때'GetLastError'를 검사 할 것을 제안합니다. 그렇지 않으면, 나는 단서가 없습니다! –
'ReadConsoleW'의 반환 값을 검사했으나 반환 값이 0이 아니었을 때마다 오류가 없었습니다. 또한 스택 손상으로 인해 충돌이 발생하면 디버거가 프로그램의 끝에 있습니다. – Josh