2011-04-22 77 views
5

它崩潰上執行:爲什麼這個程序保持崩潰

#include <iostream> 

int main() 

{ 
    if(main()); 
    return 0; 
} 

爲什麼?

+0

看起來像一個無限循環給我。 – yogsma 2011-04-22 19:08:47

+1

我希望我們能幫你解決你的作業問題...... ;-) – 2011-04-22 19:10:23

+6

這是關於這個網站的... – 2011-04-22 19:12:05

回答

11

它崩潰由於Stackoverflow當然,因爲沒有終止條件, 但技術上C++編譯器被允許不編譯它,因爲在C++:

main() cannot be called from within a program. 
The address of main() cannot be taken. 
The main() function cannot be overloaded. 

什麼標準說:

附件至C了兼容性

3.6

Change: Main cannot be called recursively and cannot have its address taken 
Rationale: The main function may require special actions. 
Effect on original feature: Deletion of semantically well-defined feature 
Difficulty of converting: Trivial: create an intermediary function such as mymain(argc, argv). 
How widely used: Seldom 
0

根據站點的名稱,您導致堆棧溢出。

每當程序執行if聲明時,它會在堆棧中放入一些信息,以便它可以返回。然而程序會一直重複這個操作直到它沒有空間,導致堆棧溢出。

0

如果main函數調用main函數,則嵌套深度無限。但是,每個嵌套層次都需要更多的內存。由於這個過程永遠不會結束,所以你最終會運行可用的內存(確切地說,是堆棧的內存,它的數量級爲幾兆字節,而且還有很多函數調用)。然後操作系統殺死進程。

2

ISO/IEC 14882:2003(E)3.6.1(3)

不應使用該函數main(3.2)中的程序內。 main的鏈接(3.5)是實現定義的。聲明main爲內聯或靜態的程序是不合格的。名稱main不保留。 [例如:成員函數,類和枚舉可以稱爲main,其他名稱空間中的實體也可以稱爲main。 ]