死遞迴 「段錯誤」產生的可能原因之一

2021-05-18 08:32:11 字數 733 閱讀 2839

我和linux下的「段錯誤」的第一次邂逅是在前幾天,當我嘗試著去寫乙個控制台下的掃雷程式的時候。

掃雷程式在這裡且不談演算法的優劣,個人認為關鍵的兩點乙個是給雷點周圍的點置上相應的雷數,另一點就是當點乙個非雷點時自己開連著的那一版非雷區。

這裡的第二點我使用的是遞迴演算法。到目前為止,雖然我的簡單版程式已經基本完成,可我還沒來得及找到別人的源程式來學習,至少在我的想象力範圍內好像是必須得使用遞迴才行。

在初次寫好測試時,有幾次是開乙個點就提示「段錯誤」,有幾次是開了幾個非雷點也非空白點後再開某點提示「段錯誤」。在google上搜了下,網友們一般認為造成「段錯誤」的原因是:訪問了不存在的記憶體,或者系統保留的記憶體位址,比如0位址。但是我感覺這放在我的程式裡並不適用,因為感覺在我的程式裡沒有這樣的語句。用gdb除錯未果--提示了錯誤資訊,但我一頭霧水。所以只好新增了一小段**,讓程式在我開始掃雷前先將雷點資訊全部輸出來,然後對照這些雷點資訊嘗試測試了多次後,終於發現原來是寫了個死遞迴。眾所周知,遞迴運算每次都會對現場資訊進行保留以備下次呼叫時使用,而這些資訊就是儲存在堆疊段裡,我想這裡系統提示的「段錯誤」應該是指堆疊段溢位的問題。

果然不出我所料,更正了無限遞迴的問題後一切正常了,成功實現了想要的目標。

產生錯誤的**原理如下:

當我開乙個空白點(即它又不是雷而且周圍雷數字為0)那就要對它周圍的幾個點進行遞迴檢查以便自動開啟一片,倘若不判斷它周圍的某點以前是不是已經檢查過了,那程式將有可能在兩個點之間反覆遞迴檢查對方,如此一來,死遞迴便形成了。

ViewPager 丟失監聽事件的原因之一

前幾天寫的指示器內對viewpager進行了監聽,但是當當前viewpager不可見 又變成 可見後,會丟失一次監聽事件。也就是說 只能監聽到 滑動,但是監聽不到沉降和停止。這主要是 viewpager原始碼內的乙個變數問題。使用 requestlayout 可以重置布局,這樣變數就會變為true,...

mysql資料庫突然不見的原因之一

在網上看到很多種導致mysql資料庫不見的情況,大概率是許可權的原因。我今天也遇到了,開啟workbench並登入,左邊schemas中的資料庫列表大白一片,乍看嚇一跳。趕緊登入後台,通過mysql命令登入,執行show databases只看到information schema,連mysql和s...

iOS加入微信分享時報錯的原因之一

是因為在build setting裡面的other linker flags加入了 all load引起的衝突後改為 force load空格 users lili desktop xx xx classes third share wechat libwechatsdk.a就沒有衝突了 普及知識 ...