1.什么是段错误(segmentation fault)?????????
? ? ? ? 段错误是指访问的内存超出了系统给的这个程序设定的内存空间,也就是访问非法内存
2.什么是core文件?
? ? ? ? 当错误发生时,操作系统会吧程序需crash时的内存dump出来,并保存到一个core文件中
3.段错误的分类:
? ? ? ? a.往系统保护的内存地址写数据
#include <stdio.h> int main (void){ int *ptr = (int *)0; *ptr = 100; return 0;}输出结果:段错误(核心已转储)
? ? ? ? b.内存越界(数组越界,变量类型不一致)
#include <stdio.h>
int main (void)
{
char test[10];
printf ("%c\n", test[100000]);
return 0;
}输出结果:段错误(核心已转储),我将字符串转换为字符数组的时候出现了这个错误,char a[] 括号类的值要大于等于string.size()就好了
? ? ? ? c.访问不存在的内存地址
#include <stdio.h> int main (void){ int *ptr = NULL; *ptr = 0; return 0;}输出结果:段错误(核心已转储)
? ? ? ? d.访问只读的内存?
#include <stdio.h>#include <string.h> int main (void){ char *ptr = "test"; strcpy (ptr, "TEST"); return 0;}输出结果:段错误(核心已转储)
? ? ? ? e.访问废弃的指针,指悬空指针,或者给指向null的指针赋值
#include <stdio.h> int main (void){ int *ptr = NULL; printf ("%d\n", *ptr); return 0;}输出结果:段错误(核心已转储)
? ? ? ?????????还有,比如malloc 动态分配内存,释放、置空完成后,不可再使用该指针。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}输出结果:hello段错误 (核心已转储)
????????f.堆栈溢出导致的段错误
????????
#include <stdio.h>
#include <string.h>
int main (void)
{
main ();
return 0;
}输出结果:段错误(核心已转储)
? ?
|