爲什麼會出現分段錯誤? 我想找到一個數字的所有因素,並把它們放在一個向量中。除了使用while循環外,我還有另外一個功能可以做同樣的事情。所以我想我會嘗試遞歸。 「我」最初從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 = 45000開始,我可以測試從45000到85000的數字沒有問題。高於85000就會崩潰。
我想知道爲什麼會發生這種情況。從GDB用gcc編譯在cygwin的窗口上
7.
錯誤信息是:
計劃接收信號SIGSEGV,分割故障。 0x000007fefcec10d6在WaitForSingleObjectEx() 從/cygdrive/c/Windows/system32/KERNELBASE.dll
對於GCC,不是Windows上的默認堆棧大小大約8 MB?我知道.Net它是每個線程1 MB。通常我切換到顯式遞歸(也許使用'vector <>'作爲堆棧),並將迭代移動到堆中。當然,如果你只是想找到素數的話,那裏有一些很棒的算法。 – 2013-10-26 04:18:21
你忘了問一個問題。你想知道這是爲什麼嗎?你想知道該怎麼辦?或者是什麼? –
剛剛進行測試,你的堆棧看起來是8MB,因爲這是事情爆炸的時候。我不知道爲什麼它被報告爲分段錯誤而不是堆棧溢出。你使用的是gcc還是g ++?也許粘貼完整的錯誤信息? – 2013-10-26 04:44:56