Почему есть ошибка сегментации?
Я хочу найти все факторы числа и поместить их в вектор. У меня есть другая функция, которая делает то же самое, но использует цикл while. Поэтому я решил попробовать рекурсию. «i» изначально начинается с 1, если я не добавлю какое-либо другое значение в main.cpp. Строка «Cout I» просто там, так что я могу видеть, где она терпит неудачу.
void recurfact ( std::vector <int> & facts, int numb, int i )
{
std::cout << i << std::endl;
if ( i > numb )
{
return;
}
if ( numb % i == 0 )
{
facts.push_back(i);
i = i + 1;
recurfact ( facts, numb, i );
}
else
{
i = i + 1;
recurfact ( facts, numb, i );
}
}
Так что это работает, если я проверяю его с числами меньше 42800 +/- 100. Если я пытаюсь любое число больше этого, он просто останавливается. Отладчик говорит, что произошла ошибка сегментации. Если я закомментирую строку push_back, она все равно вылетает при этом значении i.
Однако, если я начну с i = 45000, я могу без проблем протестировать числа от 45000 до 85000. Выше 85000 сбой.
Мне нравится знать, почему это происходит.
Компиляция с gcc в cygwin на windows 7.
Сообщение об ошибке от GDB:
Программа получила сигнал SIGSEGV, Ошибка сегментации.
0x000007fefcec10d6 в WaitForSingleObjectEx ()
от /cygdrive/c/Windows/system32/KERNELBASE.dll
Посмотрите этот документ о сбое сегментации в системах типа Unix:
http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt
В Unix-подобных системах программы могут выдавать ошибку «Ошибка сегментации». Это может быть связано с переполнением стека, особенно из-за рекурсии
вызовы функций или огромные наборы данных. В нашей демонстрационной программе «Пи» (см.
«$ (CORE_PATH) / progs / pi»), мы вычисляем Pi для любого количества желаемых бит
или цифры. Вот некоторые результаты теста, когда переполнение стека будет
происходят на разных платформах, используя их размеры стека по умолчанию.
Других решений пока нет …