Рекурсивный main() - почему это segfault?
Почему выполняется следующее segfault?
int main() { main(); }
Несмотря на то, что это рекурсия, которая не заканчивается и поэтому по определению недействительна, я не понимаю, почему она segfaults (gcc 4.4.3 и clang 1.5 (trunk)).
Ответы
Ответ 1
Поскольку каждый раз, когда он вызывает себя, он выделяет немного пространства стека; в конечном итоге он исчерпывает пространство стека и segfaults. Тем не менее, я немного удивлен, что это связано с segfault; Я бы ожидал (барабан) переполнение стека!
Ответ 2
Вы получаете переполнение стека (!)
Ответ 3
int main() { main(); }
приведет к переполнению стека.
Но,
оптимизированная версия (не режим отладки):
int main() {
return main();
}
преобразует рекурсию в хвостовой рекурсивный вызов, иначе называемый бесконечным циклом!
Ответ 4
это рекурсия без базового регистра, что приводит к переполнению стека
Ответ 5
Это приводит к переполнению стека, который диагностируется как segfault в вашей системе.
Ответ 6
Каждый вызов функции добавляет в стек, и эти записи удаляются из стека при выходе из функции.
Здесь мы имеем рекурсивный вызов функции, который не имеет условия выхода. Таким образом, его бесконечное количество функций вызывает одно за другим, и эта функция никогда не выходит и не удаляется из стека, и это приведет к переполнению стека.