【问题标题】:Is the returned value of the main method saved in the stack?main方法的返回值是否保存在堆栈中?
【发布时间】:2017-05-14 16:15:14
【问题描述】:

如果我在 C 中有一个 int main() 方法,并且有一个返回值,那么这个值是在 return 语句执行后保存在堆栈中还是在返回后堆栈中没有任何可见的东西?

【问题讨论】:

  • 这取决于架构和调用约定以及返回类型。例如,通常在 x86_64 上,整数返回值将存储在寄存器 rax 中,而不是堆栈中。例如,如果您返回一个浮点值或一个结构体,情况会有所不同。
  • C 不支持方法。也没有提到使用堆栈!

标签: c stack return


【解决方案1】:

这完全依赖于实现 - 操作系统会处理main 之前和之后发生的事情。

可能有一个围绕主调用的框架,它接收返回值并将其存储在局部变量中。但无论哪种方式,您都无法访问它,因为您的程序已经结束。

【讨论】:

    【解决方案2】:

    C 语言没有定义任何关于堆栈、调用约定或实现如何满足main 返回时发生的要求的任何内容。实际上,在许多实现中,调用main 的入口点代码将执行类似于exit(main(argc, argv)); 的操作,在这种情况下,只要调用约定将第一个参数放入函数( exit 这里)在堆栈上,但是否是这种情况因实现而异。

    【讨论】:

      【解决方案3】:

      在我所知道的系统上,main 被视为与任何其他函数一样(必须如此,才能对 main 进行递归调用),因此返回值以 ABI 指定的任何方式传递.通常这不是堆栈,这会有点尴尬,因为函数的堆栈框架在函数返回时被破坏。在 x86 系统上,返回值通常设置在 EAX/RAX 寄存器中。

      【讨论】:

      • '必须是这样,才能对 main 进行递归调用' - 必须允许对 main() 进行递归调用的标准要求?
      • @ThingyWotsit,C++ 禁止它。 C 没有,但提到“从 initial 调用返回到主函数等同于调用退出函数”[1][2],这意味着它不是被禁止的。 random mention to the difference on SO
      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 2017-09-06
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      相关资源
      最近更新 更多