2017-05-14 9 views
-1

Cでint main()メソッドがあり、戻り値がある場合、この値はreturn文が実行された後にスタックに保存されますか、または返された後にスタックに何も表示されませんか?mainメソッドの戻り値はスタックに保存されていますか?

+0

アーキテクチャおよび呼び出し規約と戻り値のタイプによって異なります。通常、x86_64では、整数戻り値はスタック上ではなくレジスタraxに格納されます。たとえば、浮動小数点値または構造体を返すと、それは異なります。 –

+0

Cは_methods_をサポートしていません。それはスタックを使用することも言及していません! – Olaf

答えて

1

C言語では、スタック、呼び出し規約、または実装がmainが返ってきたときの処理の要件をどのように満たすかについては何も定義されていません。多くの実装では、mainを呼び出すエントリポイントコードは、exit(main(argc, argv));のような何らかの処理を行います。この場合、呼び出し規約によってスタックの最初の引数(ここではexit)がスタックに置かれると、戻り値はmainになります。しかし、それが実装によって広範に変化するかどうか。

4

これは完全にの実装に依存します - OSはmainの前後で何が起こるかを処理します。

メインコールの周りに戻り値を受け取り、それをローカル変数に格納するフレームワークがある可能性があります。しかしどちらの方法でも、あなたのプログラムは終わり、終わったので、あなたはそれにアクセスすることができません。

1

私が知っているシステムでは、mainは他の関数と同様に扱われます(また、mainへの再帰呼び出しが可能でなければならない)ので、戻り値はABIが渡すために指定した方法で渡されます。通常、それはスタックではなく、関数のスタックフレームが関数が復帰したときに破棄されるので、やや面倒です。 x86システムでは、通常、戻り値はEAX/RAXレジスタに設定されます。

+0

'であり、mainへの再帰呼び出しでmain()への再帰呼び出しが許可されなければならないという標準/ – ThingyWotsit

+0

@ ThingyWotsit、C++はそれを禁じます。 Cではなく、 "最初の関数からmain関数への復帰はexit関数の呼び出しと同じです" [\ [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

OK、情報ありがとう:) – ThingyWotsit

関連する問題