Рекурсивный main() - почему это segfault?

Почему выполняется следующее segfault?

int main() { main(); }

Несмотря на то, что это рекурсия, которая не заканчивается и поэтому по определению недействительна, я не понимаю, почему она segfaults (gcc 4.4.3 и clang 1.5 (trunk)).

Ответ 1

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

Ответ 3

int main() { main(); }

приведет к переполнению стека.

Но,

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

int main() {
   return main();
}

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

Ответ 4

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

Ответ 5

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

Ответ 6

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