web-dev-qa-db-ja.com

return 1、return 0、return -1、exitの違いは?

たとえば、次のコードを検討してください。

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 0return 1exit(0)は何をしますか? exit(0)はプログラム全体を終了し、制御はループから抜け出しますが、return 0return 1return -1の場合はどうなりますか。

21
LearNer969

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自体が特定の終了ステータスコードでプログラムを終了する可能性があることに言及してください。

27
Paolo

メインエントリ関数のreturn nは、プロセスを終了し、プロセスの結果を親プロセス(プロセスを実行したプロセス)に報告します。 0は成功を意味します。他のコードは通常、障害とその意味を示します。

2
giorashc

実行ステータスを示します。

ステータス0は、プログラムが成功したことを意味します。

0以外のステータスは、エラーまたは異常のためにプログラムが終了したことを意味します。

return n;は、メインエントリ関数からプロセスを終了し、プロセスの結果を親プロセス(プロセスを実行したプロセス)に報告します。 0は成功を意味します。他のコードは通常、障害とその意味を示します。

1
Sunil Yadav

here で説明したように、mainのコンテキストでは、returnexitの両方が同じことを行います

Q:なぜreturnまたはexitが必要なのですか?

A:実行ステータスを示すため。

あなたの例では、return文やexit文がなくても、コードは問題なく実行されます(他のすべてが構文的に正しいと仮定するなど)。また、mainintを返す場合最後にreturn 0が必要です)。

ただし、実行後、コードが期待どおりに機能したかどうかを確認する方法はありません。プログラムの戻りコード(* nix環境では、$?を使用)を使用して、コード(exitまたはreturnで設定)を取得できます。これらのコードを自分で設定するので、終了する前にコードが到達したポイントを理解します。

return 123を書くことができます。ここで、123は実行後チェックの成功を示します。

通常、* nix環境では、0は成功、ゼロ以外のコードは失敗とみなされます。

1

return n from mainexit(n)と同等です。

有効な戻り値は、プログラムの残りの部分です。その意味はOSに依存します。 UNIXでは、0は正常終了を意味し、0以外はエラーの形式が意図した目的を果たさずにプログラムを強制終了したことを示します。

あなたの例がメモリを使い果たしたように見えるとき、0(正常終了)を返すことは珍しいです。

1
Søren Debois

関数内のreturnは実行を呼び出し元に戻し、関数からのexitはプログラムを終了します。

in main function return 0またはexit(0)は同じですが、exit(0)を別の関数で記述すると、プログラムはその位置から終了します。

return 1return -1などの異なる値を返すということは、プログラムがerrorを返していることを意味します。

exit(0)を使用してプログラムを終了すると、ローカルスコープの非静的オブジェクトのデストラクターは呼び出されません。ただし、戻り値0が使用される場合、デストラクタが呼び出されます。

0
EmptyData