这是一个相当新手的问题,应该很快就能回答......
基本上,在第一次调用之后Printf in echo,内容args已损坏。在我看来,我错误地传递了指针。但不明白为什么?
#define MAX_PRINT_OUTPUT 4096
void Echo(char *args[MAX_COMMAND_ARGUMENTS], int argCount)
{
for (int i = 1; i < argCount; ++i)
{
Printf("%s ", args[i]);
Printf("\n");
}
};
void Printf(const char *output, ...)
{
va_list args;
char formattedOutput[MAX_PRINT_OUTPUT];
va_start(args, output);
vsnprintf(formattedOutput, sizeof(formattedOutput), output, args);
va_end(args);
g_PlatformDevice->Print(formattedOutput);
};
void RiseWindows::Print(const char *output)
{
//Corruption appears to occur as soon as this function is entered
#define CONSOLE_OUTPUT_SIZE 32767
char buffer[CONSOLE_OUTPUT_SIZE];
char *pBuffer = buffer;
const char *pOutput = output;
int i = 0;
while (pOutput[i] && ((pBuffer - buffer) < sizeof(buffer) - 1))
{
if (pOutput[i] == '\n' && pOutput[i+1] == '\r' )
{
pBuffer[0] = '\r';
pBuffer[1] = '\n';
pBuffer += 2;
++i;
}
else if (pOutput[i] == '\r')
{
pBuffer[0] = '\r';
pBuffer[1] = '\n';
pBuffer += 2;
}
else if (pOutput[i] == '\n')
{
pBuffer[0] = '\r';
pBuffer[1] = '\n';
pBuffer += 2;
}
else
{
*pBuffer = pOutput[i];
++pBuffer;
}
++i;
}
*pBuffer = 0;
SendMessage(this->ConsoleWindow.hwndBuffer, EM_LINESCROLL, 0, 0xffff);
SendMessage(this->ConsoleWindow.hwndBuffer, EM_SCROLLCARET, 0, 0);
SendMessage(this->ConsoleWindow.hwndBuffer, EM_REPLACESEL, 0, (LPARAM)buffer);
};
NOTE这不是生产代码,只是概念证明。
EDITg_PlatformDevice 的类型为 RiseWindows,如果不清楚的话...
EDIT这是在windows xp平台上运行的vs2008
UPDATE对于任何感兴趣的人来说,问题似乎是溢出的调用堆栈,在堆栈的更下方,然后定义了另一个大数组。重构消除了内存损坏。所以用粉笔记下堆叠殴打!