Рекурсивный main () - почему это segfault? - PullRequest
10 голосов
/ 23 марта 2010

Почему следующая программа segfault?

int main() { main(); }

Несмотря на то, что это рекурсия, которая не заканчивается и поэтому недопустима по определению, я не понимаю, почему она вызывает ошибки (gcc 4.4.3лязг 1,5 (багажник)).

Ответы [ 6 ]

35 голосов
/ 23 марта 2010

Вы получаете переполнение стека (!)

26 голосов
/ 23 марта 2010

Потому что каждый раз, когда он вызывает себя, он выделяет немного места в стеке;в конце концов, ему не хватает места в стеке и ошибок сегментов.Я немного удивлен, что это идет с сегфо, хотя;Я бы ожидал (барабанная дробь) переполнение стека !

10 голосов
/ 23 марта 2010
int main() { main(); }

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

Но,

оптимизированная версия (не режим отладки), например:

int main() {
   return main();
}

преобразует рекурсиюв хвостово-рекурсивном вызове, иначе бесконечный цикл!

3 голосов
/ 23 марта 2010

это рекурс без базового регистра, что вызывает переполнение стека

2 голосов
/ 23 марта 2010

Это приводит к переполнению стека, которое диагностируется как segfault в вашей системе.

1 голос
/ 23 марта 2010

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

...