段错误
段
段是指二进制文件内的区域,这个区域存放一个可执行文件的各种类型信息。段包含正文段(Text Segment)、数据段(Data Segment)、BSS段(BSS segment)和堆栈段(Stack Segment)。
正文段:存储指令;
数据段:存储已初始化的全局变量;
BSS段:存储未赋值的全局变量或初始化为0的全局变量,以及静态变量。
堆栈段:stack segment和其他段一样有着自己的大小,一旦越界同样会爆段错误。它是在运行时,程序动态创建的一个堆栈段,放着调用栈,保存着函数调用关系和局部变量。
段错误发生的原因
1.内存访问出错
这种情况通常是数组访问越界、类型不一致。
2.非法内存访问
这类问题主要是程序试图访问内核段内存而产生的错误。
3.栈溢出
栈,就是用来描述函数之间的调用关系,它由多个栈帧组成,每个栈帧代表着对应运行的函数。栈溢出指的是对栈的使用超出的栈的大小。引起栈溢出的原因主要有二,一个是局部变量所占用的空间太大(解决方法:增大栈空间或者用动态分配,使用堆),二是函数的调用/递归次数太多或者无限调用。
实例
int main(void)
{
char*s ="hello world";
*s ='H';
}
在程序被装载时,系统把“hello world” 连同其它字符串和const类型数据放入到内存的只读区域。在执行时,一个变量s被设为指向该字符串的位置,当再向该位置写时,就会产生段错误。
int main()
{
int*ptr = NULL;
*ptr =1;
}
空指针赋值。
int main(void)
{
int main();
return 0;
}
无限递归。