【问题标题】:Where does the returned value for 'main' function go?'main' 函数的返回值在哪里?
【发布时间】:2014-10-15 14:09:03
【问题描述】:

在 C 中,函数总是将其值返回给调用函数,而不是返回给它自己(如果返回类型不是 void)。喜欢,

int main()

但由于 'ma​​in' 函数是由操作系统调用,它不是函数。那么,'main' 函数返回的值是谁呢?当使用表达式返回值时,值会去哪里

return(0);

在程序结束时?

【问题讨论】:

  • 通常情况下,操作系统会使其对您的进程的父进程可用,(例如在bash go ./yourprogram; echo $?
  • void 的返回类型是系统特定的。允许编译器,但不需要接受 main 的返回类型(int 除外)——除非您使用独立(嵌入式)实现,否则根本没有充分的理由用返回类型定义 main除了int。只需在末尾添加 return 0; ——或者如果您的编译器支持 C99 或更高版本,您可以省略它。 (一些 C 教科书推荐使用void main() C 教科书不推荐。)
  • int main() 最好写成int main(void)
  • 相关问题。什么叫主要? stackoverflow.com/questions/3469955/…
  • 在大多数情况下,/dev/null

标签: c function return main return-type


【解决方案1】:

这完全是特定于操作系统的,但通常操作系统调用程序是通过

  1. 设置程序的地址空间,
  2. 在操作系统内部某处创建新进程的记录,
  3. 启动自己的自定义函数,调用main 并将返回值存储在操作系统内部。

我在 (3) 中提到的函数通常是一个很好的老式 C 函数,它只是跳转到 main,因此它可以捕获来自 main 的返回值,就好像它是一个普通的 C 函数(它事实上是)。之后,它将该值存储在 OS-land 中的某个位置,以便需要读取返回值的进程可以这样做。

希望这会有所帮助!

【讨论】:

  • “跳转到main”还是“调用main”?
  • @glglgl 我通常看到这是通过获取指向二进制图像的函数指针,然后调用指针来完成的。所以...有点两者?
【解决方案2】:

如前所述,这是特定于操作系统的。在 UNIX 系统中,它看起来像这样:

当您使用 gcc 编译程序时,它会在您的 main() 函数周围包装一个启动例程。该例程调用您的main() 函数并保存其返回值。然后它调用exit() 函数(您的程序也可能调用该函数),进行一些常规清理。然后此函数再次调用_exit(),这是一个系统调用,它告诉操作系统将您的main() 函数的返回值保存在进程表中(保存有关您的进程的元信息)。一旦另一个进程在您的进程 ID (PID) 上调用 wait(),您的返回值就会提供给调用进程,并且您的进程会从表中删除。

查看此资源以获取更多信息:http://www.johnloomis.org/ece537/notes/Processes/process_environment.html

【讨论】:

  • Nit-pick:它包装了一个启动例程围绕 main,not visa versa.
【解决方案3】:

'main'函数的返回值去哪了?

返回给调用进程。

在符合 POSIX 的系统上,如果调用父进程是 C 程序,它至少可以通过在子进程结束后调用 wait()waitpid() 来检索其子进程返回值的最低 8 位。

【讨论】:

  • 这是 POSIX 特定的。例如,在 Windows 上没有 waid()waitpid()
  • Windows?-> 更新了我的答案...@KeithThompson
  • 它如何到达那里以及父进程如何获得它是系统特定的。 Windows 也有检索结果的功能。
【解决方案4】:

大多数操作系统都这样调用 main:

exit(main(argc, argv, envp));

【讨论】:

  • 大多数操作系统真的有envp吗?
  • @KeithThompson 我不知道。我知道 windows、dos 和 linux 都可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2011-07-06
相关资源
最近更新 更多