Рекурсивное основное () - почему делает это segfault?

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

int main() { main(); }

Даже при том, что это - рекурсия, которая не заканчивается и поэтому недопустима по определению, я не вижу, почему это segfaults (gcc 4.4.3 и лязгают 1.5 (соединительная линия)).

10
задан Ether 4 April 2010 в 18:03
поделиться

6 ответов

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

26
ответ дан 3 December 2019 в 13:12
поделиться

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

35
ответ дан 3 December 2019 в 13:12
поделиться

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

1
ответ дан 3 December 2019 в 13:12
поделиться
int main() { main(); }

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

Но,

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

int main() {
   return main();
}

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

10
ответ дан 3 December 2019 в 13:12
поделиться

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

3
ответ дан 3 December 2019 в 13:12
поделиться

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

2
ответ дан 3 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: