2017-05-14 82 views
-1

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

+0

它取决于架构和调用约定和返回类型。例如,通常在x86_64上,整数返回值将存储在寄存器rax中,而不是堆栈中。例如,如果你返回一个浮点值,或者一个结构体,它将会不同。 –

+0

C不支持_methods_。它也没有提到使用堆栈! – Olaf

回答

1

C语言没有定义的问候堆东西,调用约定,或执行如何满足时main回报会发生什么要求。在实践中,许多实现,调用main入口点代码,只要调用约定将第一个参数传递给函数(exit这里)在堆栈上做一些像exit(main(argc, argv));在这种情况下main返回值肯定会在堆栈上,但是否这种情况在实施中差别很大。

4

这完全是取决于实现 - 操作系统处理在main之前和之后发生的情况。

有机会,有围绕主通话,接收在一个局部变量的返回值,并将其存储的框架。但无论如何,随着程序结束并完成,您将无法访问它。

1

在我知道的系统中,main被视为与任何其他函数一样(并且它必须是对于main的递归调用是可能的),所以返回值以ABI指定的任何方式传递。通常情况下,这不是堆栈,因为当函数返回时函数的堆栈框架被销毁,这会稍微有些尴尬。在x86系统中,返回值通常在EAX/RAX寄存器中设置。

+0

'它必须是,对于递归调用main才是可能的' - 必须允许递归调用main()的标准/ – ThingyWotsit

+0

@ThingyWotsit,C++禁止它。 C没有,但提到“从_initial_调用返回到主函数相当于调用退出函数”[\ [1 \]](http://stackoverflow.com/a/372​​8153/6372809)[ \ [2 \]](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf),这意味着它不被禁止。 [随机提到差异在SO](http://stackoverflow.com/questions/38560971/how-to-call-main-from-other-functions-in-c) – ilkkachu

+0

好的,谢谢你的信息:) – ThingyWotsit

相关问题