記今天在執行程式時出現的segmentation fault(core dumped)
剛剛在複習資料結構的時候寫了一些單鏈表的操作,執行的時候出現segmentation fault(core dumped) 一番查錯後發現原來在寫初始化連結串列的時候形參少加了一級指標,修改完後可以正常執行,以為這就是造成segmentation fault 的原因。
過了一會想到我之前也有犯過少加一級指標這種錯誤,但是怎麼沒遇到過segmentation fault?
經過一番搜尋和測試,最終發現這次segmentation fault的真正原因,那就是我使用了空指標!
小測試程式如下:
#include<stdio.h>
int main()
{
int *m; //預設初始化為NULL
printf("It' OK here.\n");
printf("*m = %d\n",*m); //使用NULL指標導致segmentation fault.
printf("Is here OK?\n");
return 0;
}
執行結果如下圖:
另外附上一篇關於segmentation fault(cord dumped)原因的文章
原地址:https://www.cnblogs.com/foreverW/p/7295201.html
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,堆疊溢位
不要使用大的區域性變數(因為區域性變數都分配在棧上),這樣容易造成堆疊溢位,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。