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