Debug:Program received signal SIGSEGV,Segmentation fault.

錯誤描述

最近在用Dev-C++編寫程序時,程序能夠編譯運行,奈何本該接收鍵盤輸入數據的程序,運行之後直接顯示“請按任意鍵繼續…”字樣結束運行了。調試後發現了報錯信息“Program received signal SIGSEGV,Segmentation fault.

  • 錯誤信息
    錯誤信息
  • 程序運行截圖
    Dev-C++
    剛開始我以爲是編譯器的問題,更換了VC++6.0之後錯誤依然存在。
    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

發佈了15 篇原創文章 · 獲贊 26 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章