#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. Если вы скомпилируете программу с включенной оптимизацией, будет применена оптимизация хвостовой рекурсии, и вы не получите переполнения стека, просто бесконечный цикл.