簡體   English   中英

在 c 中的 main() 中調用 main()

[英]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 Conformance4 Conformance規定:

1/ 在本國際標准中,“應”被解釋為對實現或程序的要求; 相反,“不應”應解釋為禁止。

2/ 如果違反約束或運行時約束之外的“應該”或“不應”要求,則行為未定義。 在本國際標准中,未定義的行為用“未定義的行為”一詞或省略任何明確的行為定義來表示。 這三者的側重點沒有區別; 它們都描述了“未定義的行為”。

3/ 在所有其他方面都正確、對正確數據進行操作、包含未指定行為的程序應是正確的程序並按照 5.1.2.3 進行操作。

現在,由於標准中的任何地方都沒有明確禁止main()調用自身,因此上面的第 3 條是控制方面。

可以在兩個地方(我的粗體)看到進一步的支持,首先在第5.1.2.2.3 Program termination5.1.2.2.3 Program termination

1/ 如果main函數的返回類型是與int兼容的類型,從初始調用到main函數的 return 等效於以main函數返回的值作為參數調用exit函數;

然后在第7.21.3 Files7.21.3 Files

5/ 文件可能隨后被相同或另一個程序執行重新打開,並且其內容被回收或修改(如果它可以在其開始時重新定位)。 如果main函數返回到其原始調用者,或者如果調用exit函數,則在程序終止之前關閉所有打開的文件(因此刷新所有輸出流)。

這兩個小節都支持在初始/原始調用之外可能還有其他main()調用的可能性。

是的,我們可以在 main() 函數中調用 main()。

通過函數本身調用函數的過程稱為遞歸。

好吧,您可以在 main() 函數中調用 main() ,但是您應該有一個條件,即不調用 main() 函數來終止程序。

否則,程序永遠不會返回並無限運行。

是的,你可以

簡單程序:

int main()
{
    printf("Anything");
    main();
    return 0;
}

解釋:

call stackfunction stack用於多種相關目的,但使用call stackfunction stack的主要原因是跟蹤每個活動子例程在完成執行時應返回控制的點。

當調用堆棧上使用了過多內存時,就會發生stack overflow

這里函數main()被重復調用,其返回地址存儲在堆棧中。 堆棧內存滿后。 它顯示stack overflow error

是否可以在c中的main()函數內調用main()

是否可以在c中的main()函數內調用main()

是否可以在c中的main()函數內調用main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM