2013-10-26 31 views
0

爲什麼會出現分段錯誤? 我想找到一個數字的所有因素,並把它們放在一個向量中。除了使用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

+0

對於GCC,不是Windows上的默認堆棧大小大約8 MB?我知道.Net它是每個線程1 MB。通常我切換到顯式遞歸(也許使用'vector <>'作爲堆棧),並將迭代移動到堆中。當然,如果你只是想找到素數的話,那裏有一些很棒的算法。 – 2013-10-26 04:18:21

+2

你忘了問一個問題。你想知道這是爲什麼嗎?你想知道該怎麼辦?或者是什麼? –

+0

剛剛進行測試,你的堆棧看起來是8MB,因爲這是事情爆炸的時候。我不知道爲什麼它被報告爲分段錯誤而不是堆棧溢出。你使用的是gcc還是g ++?也許粘貼完整的錯誤信息? – 2013-10-26 04:44:56

回答

0

查看關於在Unix系統類型段故障此文檔:

http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt

在Unix類系統,程序可能會拋出「分段錯誤」 錯誤。這可能是由於堆棧溢出,特別是來自函數調用或巨大數據集的遞歸 。在我們的演示程序「Pi」(參見 「$(CORE_PATH)/ progs/pi」)中,我們計算Pi到任意數量的期望位 或數字。以下是關於何時堆棧溢出 在不同平臺上使用其默認堆棧大小發生的一些測試結果。