• ベストアンサー

C言語でmain関数でのreturnとexit

C言語でmain関数でのreturnとexitは同等とされてますが、 それは『プログラムを呼び出した元の動作』も同じですか? 例えばshellやOSから見て、割り当てメモリ開放などの点で returnで終了したプログラムの後処理と exitで終了したプログラムの後処理は 全く同じになりますか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#140082
noname#140082
回答No.5

考え方としては、main()関数は一番最初に動作する関数(?)ではなく、main()関数を呼び出す関数が存在します。 ですから、returnはあくまで呼び出し元に戻ることになり、逆にexit()関数は呼び出し元には戻らずに、exit()関数内で終了することを意味します。 (※returnは、関数でないことはご存じですよね) 最近の事情にはうといですが、確か void main( int argc ,char *argv[ ] ) ですよね? だとすると、main()関数で return 0 とは、記述できないですから結果的にプログラムの起動元には、値を返すことはできません。 つまり、returnでプログラムを終了した場合の戻り値は、不定となります。 でも、最近のは大丈夫なのかな? 特にMS系のは。

その他の回答 (9)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.10

組込みというより、正確にはフリースタンディング環境を同列に議論するのは無意味です。 なぜなら、フリースタンディング環境では、JIS X3010:2003の5.1.2.1 フリースタンディング環境を読めば明らかなように、プログラム開始時に呼び出される関数の型と名前は処理系定義ですし、プログラム終了処理の効果も処理系定義です。 また、ごく一部のヘッダを除き、フリースタンディング環境は標準ライブラリをどう扱うかも処理系定義です。 つまり、フリースタンディング環境では、mainで始まる必要はなく、仮にmainで始まってもそれがどんな型であってもよく、「終了」というのがどんな振舞いであってもよく、exit関数はあってもなくてもよく、仮にexit関数があったとしても、どんな仕様でもかまわないのです。

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.9

環境によるでしょうね。 マイクロチップのC30コンパイラで試してみました。 ソースコードは if( dx==0 ) exit(1); else return 0 ; return 先では ReservedBR reset の2命令を実行、 ReservedBR はインストラクションセットに含まれていない命令、調べてみたけど良く分からない。 reset はCPUをリセット状態にする命令 exit() では色々しています。 引数によって異なる関数を呼んでいますが詳細は追い切れませんでした。 まあ、組み込み系ではそもそもmain()がreturn する事を想定しない場合が多いです。 exit()が必要な状況になった場合は自分で必要な処理を書きます。 組み込み開発では main() を呼ぶ前にする為の処理(crt0.o)まで自分で書く事も有りますので、なんでもありでしょう。 実際に書いた事も有りますが、やった事は初期値付き変数の初期化とスタックポインタの初期化ぐらい。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

最初の main の呼び出しから return する場合, それはその値を引数にして exit 関数を呼び出すのと等しい (ただし条件あり), だったような.

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.7

>void main( int argc ,char *argv[ ] ) mainの戻り値はintです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

おかしな回答がありますが... mainの形式は、 int main(void); または int main(int argc, char *argv[]); のどちらか(あるいは、これらのいずれかと等価な形式)でなければなりません。 昔(標準化以前)は、そもそもvoid型というものがなかった(独自の方言として導入されている場合はありましたが...)ので、昔から、 void main(int argc, char *argv[]); というのは、少なくとも移植性のある形式ではありません。 なお、C99以降は、main関数でreturn文を省略した場合、関数の末尾に return 0; が記述されたものとみなされます。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.4

大抵のCは exit(main(argc、argv)); または r=main(argc、argv); exit(r); とmain関数を呼び出していると思います。他の方法にする理由が分かりません。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

Cの場合は同じです。 ただし、実行時間やプログラムサイズは微妙に違ってくる可能性があります。 ちなみに、C++では動作が異なりますので要注意です。

  • a_kwn
  • ベストアンサー率34% (8/23)
回答No.2

この質問は、私は超難問だと思うのですが…。 規格上”差がない”とされていると記憶しているのですが、この質問に自信をもって ・同じである ・いや、違う(環境を知っている) ・そもそも規格上も差があるでしょ という人がいらっしゃったら、ぜひ回答をしてもらいたいです。 ただ、メジャー(というか、一般的な)環境なら一緒のはずだと信じています。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

プラットフォームにもよりますがWindowsやLinuxでの実装だと そのようになってると考えて問題ないです。

関連するQ&A

  • exitとreturnの使い分け

    通常の開発でexitは使ってもいいのでしょうか? main以外の関数でbool型でmainに処理を戻しプログラムを終了させるのと、関数内でexitを使い処理を終了させることの違いと具体的にどういう場合に使い分けたらいいのかを教えてください。 できるだけ詳しく教えてもらえるとうれしいです。

  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

  • main関数の戻り値について

    c言語において、main関数の戻り値は何を意味しているのですか。 また、void型にすれば、main関数の戻り値を書かなくても問題無いでしょうか。 また、関数はreturn文を書かなくても、最後まで処理を実行すると終了するらしいですが、void型にすれば、main関数でreturn文を書かなくても問題無いでしょうか。

  • C++言語のmain関数の戻値について

    WindowsでVisualC++を使っています。int main() {~return 0;} で正常終了ですが、int main(){~return 1;}と0以外の数値を返してしまった場合、OSは何か処理をするのでしょうか?何かゴミ・スレットや、プログラムがメモリに残ったり、問題が残るのでしょうか? よろしくお願いします。

  • main関数の戻り値

    C言語のmain関数の戻り値はint型ですよね。 私もそういう決まりだと思って守ってきました。 しかし、「mainが戻り値を返すって、どこに返すの?」ということが、私は理解できていません。 私が調べたところでは、「ホスト実行環境」という言葉がこの問題に関係あるようですが、この言葉の意味はよくわからないですし、似た言葉で「ホスト環境」ということばがあるのですが意味も関係もわかりません。 これらは、OSとは違うと思うんですが、自信はありません。 それでも、ない知識を振り絞っていろいろ考えてみると、次のようなことらしいのですが、正しいでしょうか。 ・OSはプログラムの実行に先立ちホスト実行環境を作る。 ・静的記憶域のオブジェクトを初期化するのはホスト実行環境である。 ・関数が、main関数を呼ぶことは可能である。(以下では、main関数が関数から呼ばれる場合は除く。) ・main関数を呼ぶのは、ホスト実行環境が行なう。 ・main関数の中のreturnによってプログラムが終了するのと、exit関数でプログラムが終了することに違いはない。 ・main関数の戻り値は、ホスト実行環境に返される。 ・returnによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・exitによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・必ずexitで値が返されるならば、main関数の中にreturnはなくてもよい。 main関数からの戻り値をどうしようと構わないんだと思うんですが、皆さんの経験の中で、実例としてこういうふうに使われる、というのは何かないのでしょうか。 (ホスト実行環境に値が返される、といっても無視するのでは意味はないと思うのです。 その値の使用例としては、 0が返ってくると「プログラムは正常終了しました。」と表示するとか、0以外の値が返されると別のプログラムが走るとか、 そういうことだと思うんですが。)

  • C言語で、自分で作った関数内で終了させるには

    C言語なのですが、自分でエラーチェックをする関数を作りました。 エラーを検出した時点でプログラムを終了させたいのですが、 どのようにすればいいのでしょうか? return 0; はmain関数を終了させるときに使うのはわかるのですが… 初歩的な質問かもしれませんが、よろしくお願いします。

  • エラー処理,メモリ開放,exit

    こんばんは。現在、次のような C のプログラムを作っています。 ・ 動的にメモリを確保した配列や構造体が複数ある。 ・ しばしば,関数呼び出しのネストが複数(2~4) になる。 ・ ”エラーチェック => エラーなら終了” という動作が多い。 このようなプログラムで,"エラー => プログラム終了" の際,動的に確保したメモリを,関数呼び出しのネストを(return文 で)遡って,全て開放すべきでしょうか。 このようにすると,あまりにプログラムが煩雑になるので,今は "エラー => exit(-1) で直ちに終了" としています。 しかし改めて C の教科書を見ると,exit の時,オープンされているファイルやストリームについては,捨てられ,あるいは閉じられる,と書いてありますが,メモリについては何も書かれていないので,どうするべきか少し悩んでいます。 みなさんはこんな場合,どうされていますでしょうか? ご意見を下されば幸いです。よろしくお願いします。

  • EXIT関数のGcc3.2.3でのコンパイルエラー

    mainで異常終了するときにexit関数で終了するHP-UX Cのプログラムがあります。 これをGcc3.2.3でコンパイルすると下記のエラーとなります. これをコンパイルエラーとしない方法を教えてください。 C言語の書物上は、引数なしでもOKなのですが。 「関数 `exit' への引数が少なすぎます」

  • main文のreturnは0以外は何ができるの?

    はじめまして。c初心者です。 main文の最後に書くreturnはreturn 0 の0を変えると、プログラムが終了した後、もう一度起動するみたいな話を聞いたことがあります。returnについて教えていただけませんか?よろしくお願いします。

  • main関数終了時のreturnの意味は?

    質問の題名通り、main関数終了時のreturnの意味が知りたいです。いつもは参考書に書いてある通り、return 0とやっていたのですが、参考書のサンプルプログラムでreturn 1というのがでてきた為、少し混乱しました。 参考書に説明が載っていないのでmain関数内でのreturnの意味をご教授願いたいです。よろしくお願いいたします。

専門家に質問してみよう