Почему эта программа продолжает сбой - PullRequest
5 голосов
/ 22 апреля 2011

Вылетает при выполнении:

#include <iostream>

int main ()

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

Почему?

Ответы [ 4 ]

11 голосов
/ 22 апреля 2011

Вылетает из-за 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
2 голосов
/ 22 апреля 2011

ИСО / МЭК 14882: 2003 (E) 3.6.1 (3)

Функция main не должна использоваться (3.2) внутри программы. Связь (3.5) с main определяется реализацией. Программа, которая объявляет main как встроенную или статическую, некорректна. Имя main не является зарезервированным. [Пример: функции-члены, классы и перечисления могут называться main, как и сущности в других пространствах имен. ]

0 голосов
/ 22 апреля 2011

Если функция main вызывает функции main, вы имеете бесконечную глубину вложенности.Однако каждый уровень вложенности требует немного больше памяти.Поскольку этот процесс никогда не заканчивается, вы в конечном итоге запускаете доступную память (точнее, память стека, которая имеет порядок величин в несколько мегабайт и действительно много вызовов функций).Затем операционная система убивает процесс.

0 голосов
/ 22 апреля 2011

В соответствии с именем сайта вы вызываете переполнение стека.

Каждый раз, когда ваша программа выполняет оператор if, она помещает в стек небольшую информацию, чтобы она могла вернуться обратно.однако программа будет повторять это до тех пор, пока не выйдет из пространства, что приведет к переполнению стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...