1. 程式人生 > >segmentation fault(core dumped)

segmentation fault(core dumped)

Segmentation fault 這個提示還是比較常見的,這個提示就是段錯誤,這是翻譯還是十分恰當的。

Core Dump 有的時候給我們呈現的翻譯很有趣是”吐核“,但是實際上比較貼切的翻譯是核心轉儲(是作業系統在程序收到某些訊號而終止執行時,將此時程序地址空間的內容以及有關程序狀態的其他資訊寫出的一個磁碟檔案。這種資訊往往用於除錯),這個“吐核”的產生和王安博士有著一些關聯,其實“吐核”這個詞形容的很恰當,就是核心記憶體吐出來。

出現這種錯誤可能的原因(其實就是訪問了記憶體中不應該訪問的東西):

  1,記憶體訪問越界:

    (1) 陣列訪問越界,因為下標出超出了範圍。

       (2) 搜尋字串的時候,通過字串的結尾符號來判斷結束,但是實際上沒有這個結束符。

                (3)使用strcpy, strcat, sprintf, strcmp,strcasecmp等字串操作函式,超出了字元中定義的可以儲存的最大範圍。使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函式防止讀寫越界。

  2,多執行緒程式使用了執行緒不安全的函式。

  3,多執行緒讀寫的資料未加鎖保護。

    對於會被多個執行緒同時訪問的全域性資料,應該注意加鎖保護,否則很容易造成核心轉儲

  4,非法指標

      (1)使用NULL指標

      (2)隨意使用指標型別強制轉換,因為在這種強制轉換其實是很不安全的,因為在你不確認這個型別就應該是你轉化的型別的時候,這樣很容易出錯,因為就會按照你強制轉換的型別進行訪問,這樣就有可能訪問到不應該訪問的記憶體。

   5,堆疊溢位

    不要使用大的區域性變數(因為區域性變數都分配在棧上),這樣容易造成堆疊溢位,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。  

遇到過兩次了   第一次是做一個佇列題  兩個條件  我只判斷最後一個i條件之後是不是為空   忽略了第一個也會出現這種情況   沒把這個錯誤當回事

第二次是一個貪心題   找了半天沒有超記憶體的情況  sad   突然發現我的輸入沒有&符號。。。。

決定搞一搞這個東西了  抓