[英]calling main() in main() in c
是否可以在 c 中的main()
函數中調用main()
?
是的,C 允許您調用 main 函數(而 C++ 不允許)
確實允許從自身調用main()
,甚至可以使用用於任何其他遞歸代碼的相同方法避免堆棧溢出,終止條件例如:
#include <stdio.h>
int main (int argc, char *argv[]) {
printf ("Running main with argc = %d, last = '%s'\n",
argc, argv[argc-1]);
if (argc > 1)
return main(argc - 1, argv);
return 0;
}
當作為testprog 1 2 3
運行時,輸出:
Running main with argc = 4, last = '3'
Running main with argc = 3, last = '2'
Running main with argc = 2, last = '1'
Running main with argc = 1, last = 'testprog'
然而,由於這只是軼事證據,我們應該轉向標准。 ISO C11 第4 Conformance
節4 Conformance
規定:
1/ 在本國際標准中,“應”被解釋為對實現或程序的要求; 相反,“不應”應解釋為禁止。
2/ 如果違反約束或運行時約束之外的“應該”或“不應”要求,則行為未定義。 在本國際標准中,未定義的行為用“未定義的行為”一詞或省略任何明確的行為定義來表示。 這三者的側重點沒有區別; 它們都描述了“未定義的行為”。
3/ 在所有其他方面都正確、對正確數據進行操作、包含未指定行為的程序應是正確的程序並按照 5.1.2.3 進行操作。
現在,由於標准中的任何地方都沒有明確禁止main()
調用自身,因此上面的第 3 條是控制方面。
可以在兩個地方(我的粗體)看到進一步的支持,首先在第5.1.2.2.3 Program termination
節5.1.2.2.3 Program termination
:
1/ 如果
main
函數的返回類型是與int
兼容的類型,從初始調用到main
函數的 return 等效於以main
函數返回的值作為參數調用exit
函數;
然后在第7.21.3 Files
節7.21.3 Files
:
5/ 文件可能隨后被相同或另一個程序執行重新打開,並且其內容被回收或修改(如果它可以在其開始時重新定位)。 如果
main
函數返回到其原始調用者,或者如果調用exit
函數,則在程序終止之前關閉所有打開的文件(因此刷新所有輸出流)。
這兩個小節都支持在初始/原始調用之外可能還有其他對main()
調用的可能性。
是的,我們可以在 main() 函數中調用 main()。
通過函數本身調用函數的過程稱為遞歸。
好吧,您可以在 main() 函數中調用 main() ,但是您應該有一個條件,即不調用 main() 函數來終止程序。
否則,程序永遠不會返回並無限運行。
是的,你可以。
簡單程序:
int main()
{
printf("Anything");
main();
return 0;
}
解釋:
call stack
或function stack
用於多種相關目的,但使用call stack
或function stack
的主要原因是跟蹤每個活動子例程在完成執行時應返回控制的點。
當調用堆棧上使用了過多內存時,就會發生stack overflow
。
這里函數main()
被重復調用,其返回地址存儲在堆棧中。 堆棧內存滿后。 它顯示stack overflow error
。
是否可以在c中的main()
函數內調用main()
?
是否可以在c中的main()
函數內調用main()
?
是否可以在c中的main()
函數內調用main()
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.