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