分段错误和堆栈溢出有什么区别?
问题描述:
例如,当我们调用say,递归函数时,连续的调用被存储在堆栈中。但是,如果它无限地发生错误,则会出现“分段错误”(如GCC上所示)。分段错误和堆栈溢出有什么区别?
它不应该是'堆栈溢出'?这两者之间的基本区别是什么?
顺便说一句,一个解释将比*链接更有用(通过了,但没有回答具体的查询)。
答
堆栈溢出是导致分段错误的原因。
至少在x86和ARM,“堆栈”是一块内存用于放置局部变量和返回的函数调用地址保留。当堆栈耗尽时,保留区外的内存将被访问。但是该应用程序并未向内核请求此内存,因此会生成SegFault以进行内存保护。
答
调用堆栈正在溢出,但溢出的结果是最终调用相关的值被推入内存中,而不是堆栈的一部分,然后 - SIGSEGV
!
答
现代处理器使用内存管理器来保护进程彼此。 x86内存管理器有许多遗留功能,其中之一是分割。分割是为了防止程序以某种方式操纵内存。例如,一个段可能被标记为只读,并且代码将被放在那里,而另一个段被读取/写入,这就是数据所在的位置。
在堆栈溢出期间,会耗尽分配给其中一个段的所有空间,然后程序开始写入内存管理器不允许的段,然后出现段错误。
答
堆栈溢出可以显示为显式堆栈溢出异常(取决于编译器和体系结构),也可以显示为分段错误,即无效的内存访问。最终,堆栈溢出是堆栈空间用尽的结果,堆栈空间不足的一个可能结果是读取或写入您不应访问的内存。因此,在许多体系结构中,堆栈溢出的结果是内存访问错误。
溢出的东西是关于编程问题,故障的东西是关于服务器。 oO – 2010-04-21 18:13:53
@Pavel:SIGSEGV与服务器有什么关系?虽然服务器应用程序可能会导致分段错误,但这与服务器管理以及与编程有关的所有事情无关。 – 2010-04-21 18:17:10
@George:http://serverfault.com/和whoosh。 – kennytm 2010-04-21 18:20:21