- ベストアンサー
C言語でmain関数でのreturnとexit
C言語でmain関数でのreturnとexitは同等とされてますが、 それは『プログラムを呼び出した元の動作』も同じですか? 例えばshellやOSから見て、割り当てメモリ開放などの点で returnで終了したプログラムの後処理と exitで終了したプログラムの後処理は 全く同じになりますか?
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
考え方としては、main()関数は一番最初に動作する関数(?)ではなく、main()関数を呼び出す関数が存在します。 ですから、returnはあくまで呼び出し元に戻ることになり、逆にexit()関数は呼び出し元には戻らずに、exit()関数内で終了することを意味します。 (※returnは、関数でないことはご存じですよね) 最近の事情にはうといですが、確か void main( int argc ,char *argv[ ] ) ですよね? だとすると、main()関数で return 0 とは、記述できないですから結果的にプログラムの起動元には、値を返すことはできません。 つまり、returnでプログラムを終了した場合の戻り値は、不定となります。 でも、最近のは大丈夫なのかな? 特にMS系のは。
その他の回答 (9)
- jacta
- ベストアンサー率26% (845/3158)
組込みというより、正確にはフリースタンディング環境を同列に議論するのは無意味です。 なぜなら、フリースタンディング環境では、JIS X3010:2003の5.1.2.1 フリースタンディング環境を読めば明らかなように、プログラム開始時に呼び出される関数の型と名前は処理系定義ですし、プログラム終了処理の効果も処理系定義です。 また、ごく一部のヘッダを除き、フリースタンディング環境は標準ライブラリをどう扱うかも処理系定義です。 つまり、フリースタンディング環境では、mainで始まる必要はなく、仮にmainで始まってもそれがどんな型であってもよく、「終了」というのがどんな振舞いであってもよく、exit関数はあってもなくてもよく、仮にexit関数があったとしても、どんな仕様でもかまわないのです。
- tadys
- ベストアンサー率40% (856/2135)
環境によるでしょうね。 マイクロチップの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)
最初の main の呼び出しから return する場合, それはその値を引数にして exit 関数を呼び出すのと等しい (ただし条件あり), だったような.
- wormhole
- ベストアンサー率28% (1626/5665)
>void main( int argc ,char *argv[ ] ) mainの戻り値はintです。
- jacta
- ベストアンサー率26% (845/3158)
おかしな回答がありますが... 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)
大抵のCは exit(main(argc、argv)); または r=main(argc、argv); exit(r); とmain関数を呼び出していると思います。他の方法にする理由が分かりません。
- jacta
- ベストアンサー率26% (845/3158)
Cの場合は同じです。 ただし、実行時間やプログラムサイズは微妙に違ってくる可能性があります。 ちなみに、C++では動作が異なりますので要注意です。
- a_kwn
- ベストアンサー率34% (8/23)
この質問は、私は超難問だと思うのですが…。 規格上”差がない”とされていると記憶しているのですが、この質問に自信をもって ・同じである ・いや、違う(環境を知っている) ・そもそも規格上も差があるでしょ という人がいらっしゃったら、ぜひ回答をしてもらいたいです。 ただ、メジャー(というか、一般的な)環境なら一緒のはずだと信じています。
- wormhole
- ベストアンサー率28% (1626/5665)
プラットフォームにもよりますがWindowsやLinuxでの実装だと そのようになってると考えて問題ないです。