Сбой рекурсивной функции C

#c #recursion

Вопрос:

Я пытаюсь улучшить свой C и пробую этот пример

 #include <iostream>
void go(int amp; x){
   x =1;
   std::cout << x<< std::endl;
   go(x);
}
int main()
{
   int x = 0;
   go(x);
}
 

но через несколько секунд он вылетает с этой ошибкой

 261802
261803
261804
261805
261806
261807
261808
261809
261810
[1]    18523 segmentation fault (core dumped) 
 

использование циклов while работает, но сбой функции самостоятельного вызова

 #include <iostream>
int main()
{
   int x = 0;
   while (true)
   {
      x  ;
      std::cout << x << std::endl;
   }
}
 

пробовал использовать указатели, но с тем же сбоем… похоже, что это рекурсивная функция, а не интгер.

     #include <iostream>
void go(int *x){
   *x  = 1;
   std::cout << *x<< std::endl;
   
   if(*x==10000000)
      return;
   else
      go(x);
}
int main()
{
   int *x = new int(0);
   go(x);
}
 

пожалуйста, у кого-нибудь есть идеи, как исправить этот код ?
Спасибо

решенный

Спасибо все, что мне было нужно, чтобы включить оптимизацию компилятора

 set(CMAKE_CXX_FLAGS "-Wall -Wextra")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
 

Комментарии:

1. В вашем стеке только так много памяти. Ваша программа бесконечно добавляется в стек, поэтому вы вызываете переполнение стека.

2. Вам нужно условие для завершения рекурсии

3. Я просто хочу увидеть переломный момент, когда целое число достигнет максимально возможного значения , вы не сможете заставить его рекурсировать так глубоко. Ваш стек ограничен несколькими МБ, а не гигабайтами

4. @AmrOsman Если вы просто хотите увидеть переполнение int, назначьте значение int для INT_MAX и увеличьте его. Я рекомендую пройти через такой отладчик, как gdb, если вы просто пытаетесь учиться.

5. Если вы скомпилируете программу с включенной оптимизацией, будет применена оптимизация хвостовой рекурсии, и вы не получите переполнения стека, просто бесконечный цикл.