一、什么是段错误?
段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。
二、段错误产生的原因
1、访问不存在的内存地址
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { int *ptr = NULL; *ptr = 0; return 0; }
2、访问系统保护的内存地址
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { int *ptr = (int *)0; *ptr = 100; return 0; }
3、访问只读的内存地址
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { char *ptr = "test"; strcpy (ptr, "TEST"); return 0; }
4、空指针废弃
因为是一个很常见的程序错误空指针废弃(读或写在一个空指针,用于C的意思是“没有对象指针”作为一个错误指示器), 大多数操作系统内存访问空指针的地址,这样它会导致段错误。
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { int *ptr = NULL; printf("%d\n", *ptr); return 0; }
非关联化一个空指针,然后分配(写一个值到一个不存在的目标)也通常会导致段错误。
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { int *ptr = NULL; *ptr = 1; return 0; }
下面的代码包含一个空指针,但当编译通常不会导致段错误,值是未使用的。因此,废弃通常会被优化掉,死代码消除。
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { int *ptr = NULL; *ptr; return 0; }
还有,比如malloc 动态分配内存,释放、置空完成后,不可再使用该指针。
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { char* str = (char*)malloc(100); if(*str) { return ; } strcpy(str,"hello"); printf("%s\n",str); free(str); str=NULL; strcpy(str,"abcdef"); return 0; }
5、堆栈溢出
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { main(); return 0; }
6、内存越界(数组越界,变量类型不一致等)
#include<iostream> #include<algorithm> #include<vector> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; int main() { char test[10]; printf("%c\n", test[10000000]); return 0; }
标签:main,return,错误,int,c++,转储,using,include,ptr From: https://www.cnblogs.com/lyfily-p-7439305/p/17551973.html