he entrada de línea de lesionados con el siguiente código:¿Por qué está llamando a ReadConsole en un bucle que daña la pila?
DWORD dwConsoleMode;
GetConsoleMode(hStdIn, &dwConsoleMode);
dwConsoleMode ^= ENABLE_LINE_INPUT;
SetConsoleMode(hStdIn, dwConsoleMode);
Entonces me llamo ReadConsole en un bucle ... en un bucle:
wchar_t cBuf;
while (1) {
/* Display Options */
do {
ReadConsole(hStdIn, &cBuf, 1, &dwNumRead, NULL);
} while (!iswdigit(cBuf));
putwchar(cBuf);
if (cBuf == L'0') break;
}
Si ejecuto el programa y pulse 0 de inmediato, existe limpiamente.
Pero si se presiona un manojo de llaves, a continuación, pulse 0, cuando existe el programa se bloquea con:
Run-Time Check Fracaso # 2 - Stack torno a la variable 'cBuf' fue corrompida.
¿Por qué esto causa que la pila se corrompa? El código es simple, así que no puedo descifrar qué está mal.
pequeño programa que pueda reproducir el problema:
#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;
}
Tienes que tipo de machacar el teclado después de que lo ejecute, a continuación, pulse 0, y se estrella con el daño de pila.
Tampoco puedo reproducir el problema todas las veces, se necesitan algunos intentos.
Lo estaba ejecutando en Visual Studio 2010, después de crear un nuevo proyecto de consola vacía y agregar un archivo con ese código.
No puedo reproducir el problema. ¿Podría publicar un programa pequeño pero completo que muestre el problema? –
Sugeriría verificar el valor de retorno de 'ReadConsoleW' y examinar' GetLastError' cuando sea necesario. De lo contrario, no tengo ni idea. –
Comprobó el valor de retorno de 'ReadConsoleW', pero cada vez que el valor de retorno era distinto de cero, no hubo errores. Además, cuando se bloquea con la corrupción de la pila, el depurador se encuentra al final del programa. – Josh