たとえば、次のコードを検討してください。
int main(int argc,char *argv[])
{
int *p,*q;
p = (int *)malloc(sizeof(int)*10);
q = (int *)malloc(sizeof(int)*10);
if (p == 0)
{
printf("ERROR: Out of memory\n");
return 1;
}
if (q == 0)
{
printf("ERROR: Out of memory\n");
exit(0);
}
return 0;
}
上記のプログラムでreturn 0
、return 1
、exit(0)
は何をしますか? exit(0)
はプログラム全体を終了し、制御はループから抜け出しますが、return 0
、return 1
、return -1
の場合はどうなりますか。
return
from main()
はexit
と同等です
プログラムはreturn
またはexit
に渡される値としてexit statusを設定して実行を直ちに終了します
(return
ではなく)内部関数のmain
は、特定の関数の実行を即座に終了し、指定された結果を呼び出し元の関数に返します。
exit
は、コードのどこからでもプログラムの実行をすぐに終了します。
ステータス0は、プログラムが成功したことを意味します。
0以外のステータスは、エラーまたは異常によりプログラムが終了したことを意味します。
0以外のステータスで終了する場合は、stderr
を使用する代わりにprintf
にエラーメッセージを出力することになっています。
if(errorOccurred) {
fprintf(stderr, "meaningful message here\n");
return -1;
}
(使用しているOSに応じて)戻りコードに関する規則がいくつかあることに注意してください。
Googleで「終了ステータスコード」などを検索すると、SOなどのさまざまな情報が見つかります。
アクセスできないメモリの読み取りなどの無効な操作を実行しようとすると、OS自体が特定の終了ステータスコードでプログラムを終了する可能性があることに言及してください。
メインエントリ関数のreturn n
は、プロセスを終了し、プロセスの結果を親プロセス(プロセスを実行したプロセス)に報告します。 0は成功を意味します。他のコードは通常、障害とその意味を示します。
実行ステータスを示します。
ステータス0は、プログラムが成功したことを意味します。
0以外のステータスは、エラーまたは異常のためにプログラムが終了したことを意味します。
return n;は、メインエントリ関数からプロセスを終了し、プロセスの結果を親プロセス(プロセスを実行したプロセス)に報告します。 0は成功を意味します。他のコードは通常、障害とその意味を示します。
here で説明したように、main
のコンテキストでは、return
とexit
の両方が同じことを行います
Q:なぜreturn
またはexit
が必要なのですか?
A:実行ステータスを示すため。
あなたの例では、return文やexit文がなくても、コードは問題なく実行されます(他のすべてが構文的に正しいと仮定するなど)。また、main
がint
を返す場合最後にreturn 0
が必要です)。
ただし、実行後、コードが期待どおりに機能したかどうかを確認する方法はありません。プログラムの戻りコード(* nix環境では、$?
を使用)を使用して、コード(exit
またはreturn
で設定)を取得できます。これらのコードを自分で設定するので、終了する前にコードが到達したポイントを理解します。
return 123
を書くことができます。ここで、123
は実行後チェックの成功を示します。
通常、* nix環境では、0
は成功、ゼロ以外のコードは失敗とみなされます。
return n
from main
はexit(n)
と同等です。
有効な戻り値は、プログラムの残りの部分です。その意味はOSに依存します。 UNIXでは、0は正常終了を意味し、0以外はエラーの形式が意図した目的を果たさずにプログラムを強制終了したことを示します。
あなたの例がメモリを使い果たしたように見えるとき、0(正常終了)を返すことは珍しいです。
関数内のreturn
は実行を呼び出し元に戻し、関数からのexit
はプログラムを終了します。
in main
function return 0
またはexit(0)
は同じですが、exit(0)
を別の関数で記述すると、プログラムはその位置から終了します。
return 1
やreturn -1
などの異なる値を返すということは、プログラムがerrorを返していることを意味します。
exit(0)
を使用してプログラムを終了すると、ローカルスコープの非静的オブジェクトのデストラクターは呼び出されません。ただし、戻り値0が使用される場合、デストラクタが呼び出されます。