2015-11-03 38 views
1

我在C++中運行了一個深度優先搜索程序,用於非常大的圖形。 dfs是以遞歸方式寫入的。我的筆記本電腦上出現了分段錯誤11,但找不到任何錯誤。然後我在Linux服務器上運行它,它運行良好。不同機器上的分割故障11行爲

我很好奇它有什麼不同。我懷疑堆棧大小,因爲程序是遞歸的,但是當我檢查:ulimit -a時,兩臺計算機的堆棧大小都是8192 kB。我無法找到可能導致此問題的其他限制。你知道我爲什麼有這個區別嗎?謝謝!

+2

運行它通過調試器/ valgrind /等 –

+0

你可以得到的區別,因爲你的程序可能有一個錯誤,似乎只適用於一個平臺,而不是另一個。解決方案是修復這個錯誤。 Gregor建議的工具非常值得學習和使用。我會推測並說這可能是一個無效的內存訪問,如一個錯誤,使用後釋放,使用未初始化的內存等。 – Adam

+0

當相同的代碼行爲不同時,可能會有一些未定義的行爲 – Jack

回答

0

「分段錯誤」只是正式定義爲「未定義行爲」的可能結果之一。

分段錯誤的存在通常可以被推斷爲確鑿的證據,以某種方式,應用程序參與「未定義的行爲」。

而被稱爲「未定義行爲」的原因正是:應用程序的行爲沒有定義。實際行爲可能取決於處理器,體系結構,一天中的時間,月球的相位或誰贏得了世界系列賽。有時應用程序會因分段錯誤而崩潰。其他時候它可能會運行到最後,顯然會產生預期的結果,或者可能是輕微錯誤的結果,這是一個無法檢測到的行爲。你不能期望程序有任何特定的行爲,因爲它是未定義的。

這就是「未定義行爲」的含義。 「未定義行爲」的一個更好的已知同義詞是「bug」。