程序编译之后,运行程序出现以下错误:
造成这种问题的原因有很多。
如:
1.
int a = 5;
int b = 0;
a = a / b;
如果程序代码这样,就会造成上面的错误,因为除数为零,违反了 '/' 运算符的右操作数(即:除数)不能为0的规则。
2.访问不存在的内存地址
在C语言中,segment fault通常是由于指针的错误使用,特别是动态分配,非关联化一个空指针总会出现这种错误,在C中,野指针和悬空指针所指向的内存有可能存在也可能不存在,不能对其进行判断,也不能判断其读写权限。
如:
int *p = NULL;
*p = 0;
结果:
3.访问受系统保护的内存地址
int *p = (int *)0;
*p = 5;
结果:
4.数组下标越界访问
在gcc 3.4.4-3编译器中,对数组的越界访问不会报错,其越出部分的数据会在数组的后面存储,但是其地址是没有在程序中分配的,可能在程序运行中被其他程序占用,导致程序内的数据发生改变,影响程序的运行,因此,对数组我们要规划好其下标。
5.对malloc动态分配内存释放,置空后再次操作
int strcpy_dat()
{
char* str=(char* )malloc(100);
if(*str)
{
return;
}
strcpy(str,"see you");
printf("%s\n",str);
free(str);
str=NULL;
strcpy(str,"good");
return 0;
}
结果:
6.堆栈溢出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void recursion()
{
printf("%s%d",__FILE__,__LINE__);
recursion();
}
int main()
{
recursion();
return 0;
}
结果:
在例子中,使用的是无限递归,导致堆栈溢出而导致段错误,实际上,无限递归不一定会导致堆栈溢出,对于优化执行的编译器和代码的确切结构而言,这种情况下,这种代码的行为是未定义的,编译器可以消除他,使用位补调用优化,可能导致没有堆栈使用,也有可能优化将递归转换成迭代。