分段错误和堆栈溢出有什么区别?
例如,当我们调用say,recursion函数时,连续的调用被存储在堆栈中。 但是,如果无限地发生错误,则错误是“分段错误”(如GCC上所示)。
它不应该是“堆栈溢出”? 那么两者的基本区别是什么呢?
顺便说一句,解释将比维基百科链接更有用(通过了,但没有答案的具体查询)。
堆栈溢出是导致分割错误的原因。
至less在x86和ARM上,“堆栈”是为放置局部variables和返回函数调用地址而保留的一块内存。 堆栈耗尽时,保留区外的内存将被访问。 但是应用程序并没有向内核请求这个内存,所以会生成一个SegFault来保护内存。
调用堆栈正在溢出,但溢出的结果是,最终调用相关的值被推入内存不是堆栈的一部分,然后 – SIGSEGV
!
现代处理器使用内存pipe理器来保护相互之间的进程。 x86内存pipe理器有许多遗留function,其中之一是分割。 分割是为了防止程序以某种方式操纵内存。 例如,一个段可能被标记为只读,并且代码将被放置在那里,而另一个段被读取/写入,这就是数据所在的位置。
在堆栈溢出期间,会耗尽分配给其中一个段的所有空间,然后程序开始写入内存pipe理器不允许的段,然后出现段错误。
堆栈溢出可以显示为显式堆栈溢出exception(取决于编译器和体系结构)或者作为分段错误,即无效的存储器访问。 最终,堆栈溢出是堆栈空间不足的结果,并且堆栈空间不足的一个可能结果是读取或写入您不应访问的内存。 因此,在许多体系结构中,堆栈溢出的结果是内存访问错误。