錯誤描述
最近在用Dev-C++編寫程序時,程序能夠編譯運行,奈何本該接收鍵盤輸入數據的程序,運行之後直接顯示“請按任意鍵繼續…”字樣結束運行了。調試後發現了報錯信息“Program received signal SIGSEGV,Segmentation fault.”
- 錯誤信息
- 程序運行截圖
剛開始我以爲是編譯器的問題,更換了VC++6.0之後錯誤依然存在。
出錯原因
SIGSEGV是當一個進程執行了一個無效的內存引用,或發生段錯誤時由操作系統拋出的異常。
查閱了部分相關的文章和進行多次嘗試後,總結出可能的出錯原因如下:
1、指針未初始化
#include<stdio.h>
int main(){
char *a;
printf("%s",a);
return 0;
}
2、數組未被初始化,數組下標越界,數組元素不存在等
#include <stdio.h>
int main(){
char test[1];
printf("%c", test[10000]);
return 0;
}
3、使用printf輸出變量時變量格式控制不合理
例如:試圖把int型的變量a以%s的格式輸出
#include<stdio.h>
int main(){
int a=1;
printf("%s",a);
return 0;
}
4、定義在main函數中的二維數組過大
#include<iostream>
using namespace std;
int main(){
int a[1000][1000];
int N,M;
cin>>N>>M;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
cin>>a[i][j];
cout<<a[0][0];
}
排查過後,發現自己是在main裏面定義了過大的二維數組才導致了錯誤>﹏<。
解決方法
針對可能導致SIGSEGV的四種原因可分別採用以下的解決方法:
1、指針、數組未初始化>>>初始化指針、數組
2、數組下標越界、數組元素不存在>>>檢查數組下標,禁止數組越界,給不存在的數組元素賦值
3、使用printf輸出變量時變量格式控制不合理>>>規範輸出變量格式(%d%s%d)
4、在main函數中定義了過大的二維數組>>>將數組的定義移至main函數之前
另外,經過嘗試之後,還發現main函數中定義的最大二維數組爲[720][720]。
所以也就意味着,
如果要定義比這更大的二維數組就要在main函數外面定義啦!!
參考文章
Program received signal SIGSEGV, Segmentation fault.段錯誤調試
https://blog.csdn.net/oriel123/article/details/77715620