为什么写入标准输出时WriteFile会崩溃?

这是一个“Hello world”程序,它使用WinAPI的WriteFile(在Microsoft Visual C ++ 2008 Express中编译):

int _tmain(int argc, _TCHAR* argv[]) { wchar_t str[] = L"Hello world"; HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); if(out && out!=INVALID_HANDLE_VALUE) { WriteFile(out, str, sizeof(str), NULL, NULL); CloseHandle(out); } return 0; } 

如果在控制台窗口中执行,它会愉快地迎接世界。 如果你尝试redirect它的标准输出,但是,如

 hello.exe > output.txt 

该程序崩溃在WriteFile(NULL指针exception)。 尽pipe如此,output.txt存在并且包含完整的正确输出。

崩溃时的调用堆栈:

 KernelBase.dll!_WriteFile@20() + 0x75 bytes kernel32.dll!_WriteFileImplementation@20() + 0x4e bytes srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88) Line 15 + 0x16 bytes C++ 

消息:srgprc2.exe中0x75ce85ea(KernelBase.dll)的未处理的exception:0xC0000005:访问冲突写入位置0x00000000。

这里发生了什么? 谢谢!

WriteFile的第四个参数不是可选的 。 你传递NULL,这是不允许的。

第四个参数(告诉我们实际写了多少字节)期望指向DWORD值的指针(aka unsigned int),当你将NULL传递给那个参数时,它试图把DWORD写到导致异常的空指针,不仅强制通过指向该参数的指针,而且还应该在写入之后始终检查其值,因为虽然超过您提供的数据量,WriteFile将会减少写入数据的概率。