C語言裡,main 函式中 return x和 exit x 到底有什麼區別

時間 2021-05-07 19:56:44

1樓:AutherM

exit 是乙個 system call, 表示要結束這個process, 不管是parent 還是child

return 是乙個函式的返回,不一定結束這個process, 如果出現在被main呼叫的函式中,那就是返回到呼叫函式接下來的一條語句繼續執行; 如果return 在main中,則是由system start function _libc_start_main來handle

2樓:海楓

前面大神們寫得太複雜了,沒有本質上的區別。

使用exit函式可以提前返回,不需你做控制讓它走到main函式的return語句。

3樓:啊魚

main函式並不是開始,之前有個函式(至少gcc是這樣,別的不懂),姑且叫start,start函式裡初始化一些我也不知道是什麼的貌似並沒有什麼卵用的東西,然後呼叫main,

return是函式的返回,main的return就返回到start,exit是退出程序,善後,然後自殺,引數是返回到呼叫程序的,比如shell,

-----

區別就在於兩者的善後工作是不一樣的,

return會把函式棧空間釋放掉,

exit不會,

vfork是空間共享的,乙個的main釋放了,另乙個的main就走投無路了,

----

唔,好像有點問題,我再看看,

4樓:

大部分答案都進的去,出不來。這個問題清楚的回答應該這樣分層:

1. return是函式分層,exit()是函式呼叫。

2. 大部分作業系統承諾,主函式返回,程序完成清理工作後退出,並返回主函式的返回值。而根據POSIX標準,exit()系統呼叫將直接導致程序退出,可以不進入系統庫的析構函式。

我們寫高階語言的程式,要工作在語意的層面上,不是工作在實現的層面上,這是入門常識。國內很多軟體寫得爛,就是因為廣泛的「能跑就行」的思路導致的。

5樓:呵呵一笑百媚生

實際上子程序return只會導致子程序自己的相關暫存器(特別是esp、ebp)被更改,不會對共享的棧記憶體空間的內容產生影響。而子程序修改自己的暫存器並不影響父程序的暫存器,所以本來return是不會導致問題的。

問題出在當子程序return返回到main()函式的呼叫點之後,接下來的語句中會有一些別的函式呼叫,這個時候main()原來的棧記憶體空間內容被覆蓋(主要是返回位址),導致了程式的不確定行為。利用這個特點可以玩個把戲:

#include

#include

void

stack1

()void

stack2

()int

main

()正常情況下這個程式將會正確執行不會發生錯誤,如果父程序pid為1000,子程序pid為1001,那麼輸出將會是:

1001 goes 1

1000 goes 2

這是因為父程序的當前函式棧空間被子程序從stack1替換成了stack2,父程序從stack1返回時,實際上是從stack2()返回。

linux man手冊裡明確說明vfork()之後,子程序只應該呼叫_exit()或者exec函式族,甚至呼叫exit()都是不正確的!

6樓:

說白了return是return給呼叫main函式的函式,讓該函式在得知main函式返回後,開始除了main的後事,例如處理main占用的資源,例如關閉開啟的檔案,程序間通訊工具,重新整理起std快取,等。而exit()是對系統呼叫_exit()的封裝,函式可以return給作業系統由相應的處理程式呼叫exit或者程式自己直接呼叫exit

7樓:BHEscaper

很多人都在回答中指出了return與exit()之間的區別,我也表示贊同,但我對題主所遭遇的問題是否是由這種區別所引起的表示懷疑。

在我的測試環境下(Win8.1+MSYS2提供的GCC),使用return並沒有發生錯誤。

8樓:

return 和 exit 的區別上面已經講得很清楚了,system call 和 function call 的區別。至於為什麼兩個一起return 不行,我的理解是這樣的:

vfork 的child process 和 parent process 是共享一切資源,memory and stack,並且parent process要等到child process exit之後才會繼續。所以如果child process直接return, 等同於parent proces return,當然是沒有什麼問題的。但是如果parent process 再次return, 系統就迷惑了。

更專業的解釋請看這裡:

為什麼C語言要有 int 作為 main 函式的返回值,而不是 void?

main函式的返回值會被shell捕獲,並存到乙個環境變數中。在一些main loop結構的嵌入式系統中,main的返回值沒太有意義,因為嵌入式系統的軟體不會結束 上電後一直執行 或者在一些練習性質的程式中,我們也不太關注main函式的返回值。linux系統有個設計理念 乙個程式只做一件事情,並把它...

c語言中,如果main函式的末尾沒有return語句將會有什麼影響

日天山君 首先,如果是微控制器這種沒有作業系統的,直接void main 沒有引數也不需要返回值。然後才輪到在作業系統上執行的C語言程式,在int main最後寫乙個return,其目的是為了將執行結果狀態告訴作業系統 或父程序 是執行成功呢還是不成功。然後可以根據執行結果狀態採取不同的方案,是結束...

C語言裡如何按需生成函式指標陣列?

暮無井見鈴 C 怎麼生成 4096 個函式?參考這裡的巨集,編譯時生成這些函式是可行的。C 的話用 index sequence 模板就行。 VeroFess 手機回答 我是這麼做的 shellcode 彙編引擎 mmap VirtulAlloc 是不太安全 我乙個寫殼的管他安不安全 gcc下 in...