2

可能重复:
main() 在 C/C++ 中应该返回什么?

#include<stdio.h>
int main()
{
    return 0;
}

在上面给出的代码片段中,main 返回的 return 0 到哪里去了?或者换句话说,哪个函数在开始时调用了主函数。

4

4 回答 4

12

main由 C 运行时库中的某些启动函数调用。C 语言标准说从返回main等同于调用exit函数,所以大多数 C 运行时看起来像这样:

void _start(void)  /* Exact function signature may vary */
{
    /* Platform-specifi startup (e.g. fetch argc and argv from the OS) */
    ...
    int status = main(argc, argv);
    exit(status);
    /* Never reached */
}

退出状态被传递回操作系统,然后从那里发生的事情取决于操作系统。

当您编译和链接您的程序时,可执行文件格式(例如 PE 或 ELF)包含一个起始地址,即开始执行的虚拟地址。该函数通常是 C 运行时库的一部分(如_start上面的示例)。该函数必须通过调用诸如 之类的系统调用来结束exit,因为如果它刚刚返回,它将无处可去:它只会从堆栈中弹出一个地址并跳转到该位置,这将是垃圾。

根据操作系统加载程序初始化进程的方式,程序参数argcargv和其他数据(例如环境)可能作为函数参数(通过寄存器或堆栈)进入,或者它们可能需要系统调用(例如GetCommandLine在 Windows 上)检索它们。但是处理所有这些都是 C 运行时的工作,除非您明确地想尽办法避免使用 C 运行时,否则您不必担心这些细节。

于 2012-11-02T18:24:14.407 回答
3

您的编译器以特定平台为目标,其中包括用于启动进程的操作系统特定机制。该平台特定代码的一部分包含main. 当您将程序链接到可执行文件时,链接器会添加一段特定于操作系统的二进制代码,该代码负责调用main并将返回值报告回操作系统。

于 2012-11-02T18:24:41.490 回答
2

返回值转到托管环境。通常,操作系统调用main并获取程序的退出状态。

于 2012-11-02T18:24:42.123 回答
0

main 返回的 return 0 去哪里了?或者换句话说,哪个函数在开始时调用了主函数。

It is called by the C startup library, a stub function that is called (almost) directly by the kernel. For example, on Linux and OS X, it's a function named _start. It has the same signature as main() and the operating system itself uses its return value.

于 2012-11-02T18:25:27.337 回答