例如,当我们调用say,一个递归函数时,连续的调用存储在堆栈中。但是,由于错误无效,因此错误是“分段错误”(如GCC所示)。
不应该是'堆栈溢出'吗?那两者之间的基本区别是什么?
顺便说一句,解释会比维基百科链接更有帮助(通过它,但没有特定查询的答案)。答案 0 :(得分:56)
堆栈溢出是[a]原因,结果就是分段错误。
至少在x86和ARM上,“堆栈”是为保存本地变量和返回函数调用地址而保留的一块内存。当堆栈耗尽时,将访问保留区域外的存储器。但该应用程序没有向内核询问此内存,因此将生成一个用于内存保护的SegFault。
答案 1 :(得分:3)
调用堆栈正在溢出,但溢出的结果是最终调用相关的值被推送到不属于堆栈的内存中,然后 - SIGSEGV
!
答案 2 :(得分:3)
现代处理器使用内存管理器来保护彼此之间的进程。 x86内存管理器有许多遗留功能,其中之一就是分段。分段旨在防止程序以某种方式操纵内存。例如,一个段可能被标记为只读,代码将被放在那里,而另一个段是读/写的,这就是你的数据所在。
在堆栈溢出期间,耗尽分配给其中一个段的所有空间,然后程序开始写入内存管理器不允许的段,然后出现段错误。
答案 3 :(得分:2)