Почему C-программа, в которой две функции вызывают друг друга рекурсивно, дает ошибку сегментации в Linux? - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь скомпилировать следующий код C в Linux:

#include <stdio.h>
/////
void func1();
void func2();
//////
void func1()
{
  func2();
}
void func2()
{
  func1();
}
int main()
{
  func1();//call to function 1
}

Если я не ошибаюсь, программа должна выполняться бесконечно, но когда я компилирую и запускаю ее в linux, выдается ошибка сегментации.Почему это происходит?

Ответы [ 2 ]

6 голосов
/ 12 мая 2019

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

В зависимости от компилятора включение оптимизации может помочь из-за оптимизации хвостового вызова .

3 голосов
/ 12 мая 2019

Поведение, которое вы испытываете, называется переполнением стека.Это означает, что стек вызовов содержит слишком много элементов, и он переполнен (на нем не осталось места для продолжения выполнения), и программа аварийно завершает работу с SIGSEGV.Процедуры выхода не существует, поэтому было неизбежно, что это произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...