分段错误和堆栈溢出之间有什么区别?

时间:2010-04-21 18:08:06

标签: c memory stack segmentation-fault stack-overflow

例如,当我们调用say,一个递归函数时,连续的调用存储在堆栈中。但是,由于错误无效,因此错误是“分段错误”(如GCC所示)。

不应该是'堆栈溢出'吗?那两者之间的基本区别是什么?

顺便说一句,解释会比维基百科链接更有帮助(通过它,但没有特定查询的答案)。

4 个答案:

答案 0 :(得分:56)

堆栈溢出是[a]原因,结果就是分段错误。


至少在x86和ARM上,“堆栈”是为保存本地变量和返回函数调用地址而保留的一块内存。当堆栈耗尽时,将访问保留区域外的存储器。但该应用程序没有向内核询问此内存,因此将生成一个用于内存保护的SegFault。

答案 1 :(得分:3)

调用堆栈正在溢出,但溢出的结果是最终调用相关的值被推送到不属于堆栈的内存中,然后 - SIGSEGV

答案 2 :(得分:3)

现代处理器使用内存管理器来保护彼此之间的进程。 x86内存管理器有许多遗留功能,其中之一就是分段。分段旨在防止程序以某种方式操纵内存。例如,一个段可能被标记为只读,代码将被放在那里,而另一个段是读/写的,这就是你的数据所在。

在堆栈溢出期间,耗尽分配给其中一个段的所有空间,然后程序开始写入内存管理器不允许的段,然后出现段错误。

答案 3 :(得分:2)

堆栈溢出可以表现为显式堆栈溢出异常(取决于编译器和体系结构),也可以表示为分段错误,即无效的内存访问。最终,堆栈溢出是堆栈空间耗尽的结果,堆栈空间耗尽的一种可能结果是读取或写入您不应访问的内存。因此,在许多体系结构中,堆栈溢出的结果是内存访问错误。