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,堆棧溢出
不要使用大的局部變量(因為局部變量都分配在棧上),這樣容易造成堆棧溢出,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。