c - WinMain 的奇怪返回行为

标签 c windows

首先,我应该指定我正在使用 Visual Studio 中的 clang 编译器。调试以下简单程序时,当似乎满足特殊条件时,WinMain 函数返回变量的值。

#include <windows.h>    

int CALLBACK WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
    int var = 1;
    var = var + 5;
}

上面的内容将在调试器中输出:The program '[11396] Project1.exe' has exited with code 6 (0x6). 只要赋值的右侧表达式中有变量名,这种行为似乎就会发生。如果我要修改最后一行以仅分配一个文字,例如 var = 5 ,则每次输出都将是一致的不相关值: The program '[4148] Project1.exe' has exited with code -858993460 (0xcccccccc).

我怀疑这种行为与 WinMain 有关,因为当我使用普通的 main() 代替时,我得到的预期返回为 0。知道这种奇怪行为的原因是什么吗?

最佳答案

问题是您没有明确返回任何内容。

我猜想也许您执行了一些任意赋值 (var = var + 5) 碰巧在 Windows 用于返回值的寄存器中留下了一个“有效的查找”数字。

但事实是:如果没有显式的 return SOMEVALUE;,那么您的程序将显示 "undefined behavior" .

为了验证这个理论,我强烈建议您使用“/Fa”进行编译,并查看汇编输出:)

关于c - WinMain 的奇怪返回行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275329/

相关文章:

c++ - 我无法编译此 dijkstra 代码。 (算法设计手册)

python - 使用 Python 和 LibClang 解析 C 数组大小

windows - 更改全景控件的背景会使Windows Phone 7.5中带有AccessViolationException的应用程序崩溃

c - 用编译语言编写的编译器如何处理错误?

c - 计算机如何比较十六进制和十进制值

c - 为什么 fscanf 在后续调用中没有按预期工作?

windows - 无法安装 Meteor : Error 0x80070643: Failed to install MSI package

c# - 为什么 AutoIt 成功地将输入发送到 directx 应用程序而 SendInput/SendMessage 却没有?

c++ - IOCP 和 ReadFileEx 用法

c++ - 最大化窗口维护任务栏限制