什么段
我们在学习微机原理的时候就遇到过段,它代表在一个可执行文件中各种的类型信息存放的地方。
正文段:text用于存储指令;
数据段:data用于存储已初始化的全局变量;
bss段:用来存放程序中未初始化或者初始化为0的全局变量和静态变量;
堆栈段:stack和其他段一样有着自己的大小,一旦越界同样会爆段错误。它是在运行时,程序动态创建的一个堆栈段,放着调用栈,保存着函数调用关系和局部变量。
造成段错误的原因一般有如下三点:
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;
}
这个代码是很明显的无限递归,这会导致栈溢出,从而产生段错误。