主函式的原型為:
int main(int argc,char *ar**,char *envp);
argc:傳遞的引數列表中引數的個數
ar**:傳遞的引數列表
envp:傳遞的環境變數
我們在linux中編寫乙個主函式,看一下執行結果:
# include# include# include# include# includeint main(int argc,char *ar**,char *envp)
這個程式在沒有執行前,我們認為它執行出來的結果應該是,先列印乙個hello,然後睡眠5秒再列印world,但是實際執行結果卻是如下圖所示:
實際執行結果是,先睡眠了5秒,然後再列印出來「helloworld」,對此很多人都會有疑問,為什麼不是按照順序來執行程式的,其實是這樣的,printf這個函式是首先將「hello"寫到輸出緩衝區,然後再將」world\n"寫到輸出緩衝區,最後再一起列印出來的。輸出緩衝區在記憶體上。
輸出緩衝區重新整理的條件:
1、程式結束,但是以_exit(0)結束的程式不會重新整理緩衝區。
2、遇到「\n」
3、緩衝區滿,現在系統預設最多放1024個位元組
4、主動重新整理,用fflush(stdout)函式
這一次執行結果就是先列印hello,然後睡眠5秒再列印的world。
atexit函式:
函式原型:int atexit (void (*)(void));
它是在正常程式退出時呼叫的函式,我們把他叫為登記函式。⼀個程序可以登記若⼲個函式,這些函式由exit⾃動調⽤,這些函式被稱為終⽌處理函式, atexit函式可以登記這些函式。 exit調⽤終⽌處理函式的順序和atexit登記的順序相反,如果⼀個函式被多次登記,也會被多次調⽤。
例項:
#include#includevoid func1()
void func2()
void func3()
int main()
執行結果:
我們可以看到atexit函式的呼叫順序是和登記順序相反的。
atexit函式的用途也是比較廣泛的:可以按照你預設的順序摧毀全域性變數(類),例如有個log類,你在其它的全域性類裡也有可能呼叫到log類寫日誌。所以log 類必須最後被析構 。假如沒有規定析構順序,那麼程式在退出時將有可能首先析構log類,那麼其它的全域性類在此時將無法正確寫日誌。 把資料寫回檔案, 刪除臨時檔案, 這才是真正有用的.
python 函式傳參 傳參和傳引用
首先還是應該科普下函式引數傳遞機制,傳值和傳引用是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...
函式傳值傳參
var obj function x 內部宣告的變數不會影響外面的obj物件 console.log obj.n 2 obj 傳入的是乙個指標 值 x是obj指標的副本,兩者都指向同乙個物件 console.log obj.n 3 例子二 var x 1 function a x a x conso...
linux下的應用模組傳參及驅動模組傳參的區別
在使用者態下程式設計可以通過main intargc,char argv 來傳遞命令列引數,而編寫乙個核心模組則通過module param 來傳遞引數 一.應用程式命令列傳參 執行結果如下 二.核心模組傳參 module param name,type,perm 是乙個巨集,表示向當前模組傳入引數...