0

exit()教育目的のためだけに独自の機能を実装することを考えていました。OS で許可されている場合、アドレスを操作できることはわかっています (たとえば、OS ではアドレス 0 を操作できないため、クラッシュが発生します)。
だから私はなぜそのアドレスに0を送らないのかと思っreturn 0た。

int main(){
// code...
return 0;
}

OSに「return 0成功」​​を返しますよね?しかし、それはどのアドレスですか?どうすれば入手できますか?また、C 標準ライブラリの実際の exit() はこのように実装されていますか?

4

8 に答える 8

4

の場合return 0、アドレスに戻りません。0 を返しています。プロセスが値 0 を返すと、正常終了と見なされます。呼び出しプロセスによってメッセージとして解釈される可能性のあるゼロ以外の値 (最大 255) を返すことができます。

コマンドの例でこれを見てみましょうgrep foobar fubarfoobarファイルにパターンがあれば 0 (成功) を返しますfubarfoobarファイルにない場合は 1 を返しますfubar。という名前のファイルがない場合は 2 を返しますfubar。rturn 値は、このコマンドで成功または失敗の理由を評価するスクリプトで解釈できます。

于 2013-08-06T17:44:17.240 に答える
2

return 0;inはどこでもmain動作します。return呼び出された場所に戻ります。プログラムを開始すると、システムはそれをではなくmain、多くの初期化を行う開始アドレスで開始し、次のようになります。

exit( main(/*...*/) );

つまり、exitからの戻りをシミュレートしませんmainmain呼び出しから戻るexit。そして exit は、システムにプロセスを停止するように指示するシステム固有の関数を呼び出す前に、多くのシャットダウンを行います ( _exitUnix の場合)。

exit必要な情報を見つける方法がないため、自分で実装することはできません。atexit呼び出す必要がある登録済み関数のリスト、静的な有効期間を持つオブジェクトのデストラクタのリストなどです。

于 2013-08-06T18:01:17.283 に答える
2

mainここでの主な混乱は、それが C++ プログラムで起こる最初で最後のことだという考えだと思います。[1]あなたのプログラムの最初の部分ですが、通常、アプリケーションにはいくつかの設定、コマンドライン引数の解析、標準I/Oの開始/初期化(cincoutなど)などのコードがありますmainが呼び出される前に発生します。そしてmain、本質的には、「前に物事を修正する」ことを行う C++ ランタイム機能によって呼び出される単なる別の関数mainです。

そのため、main戻ると、それを呼び出したコードに戻り、クリーンアップが必要なもの (標準 I/O チャネルを閉じるなど) をクリーンアップしてから、OS 関数を呼び出して実際に終了します。 「このプロセスを終了します」。この「このプロセスを終了する」機能の一部として、(ほとんどの OS では) OS に「成功または失敗」を通知する方法であり、アプリケーションを監視している他のプロセスが「すべてが正常かどうか」を判断できるようにします。これは、最終的に0(またはin1を使用する場合) が終了する場所です。return 1;main

[1] ユーザーのコードの一部であるコンストラクターを持つ静的オブジェクトがある場合、これらはmain[または少なくとも、mainユーザーのアプリケーションに属するコードの前に] のコードが実行される前に実行されます。

于 2013-08-06T19:13:31.790 に答える
1

あなたの混乱は、何が何をするのか理解していないためですreturn。たとえば、次の関数を使用します。

int add(int x, int y)
{
   return (x + y);
}

上記の関数の return と関数の最後の return ステートメントmainはまったく同じであり、言語の観点からは同じ意味です。その意味は、呼び出し元に整数を返すことです。呼び出し元がこの値から作成するものは、呼び出し元がその関数を呼び出す意図に依存する完全に別のものです。私がadd(7, 9);2 つの GPA グレードを追加するために呼び出すことができ、別のプログラマーがいくつかの銀行口座のすべての金額の合計を見つけるために呼び出すことができるとします。

Nowmainは特別な関数として扱われます。これは、オペレーティング システム (より具体的にはそのローダー) がプログラムに対して呼び出す最初の関数であるためです。プログラムが完了した後、main返されるものは、OS のセマンティクスに基づいて何かを意味する場合があります。この値は、メモリ アドレスとは関係ありません。

余談:標準によると、C++ (および C99 以降) では、return 0;ステートメントを省略してプログラムを正常に終了させることができます。

于 2013-08-06T18:00:41.823 に答える
0

を持っている場合function、それはタイプを持っています。intvoid、またはその他のいずれかです。関数が void でない場合は、値を返す必要があります。この場合、 のreturn値はmainisintで、通常はreturnコードです。規則では、0 の場合はエラーはなく、その他の値はエラー コードです。

于 2013-08-06T18:11:52.410 に答える