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

Aru*_*iRC 27 c memory stack-overflow stack segmentation-fault

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

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

顺便说一句,解释比维基百科链接更有帮助(经历过这一点,但没有特定查询的答案).

ken*_*ytm 58

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


至少在x86和ARM上,"堆栈"是一块内存,用于放置局部变量和返回函数调用的地址.当堆栈耗尽时,将访问保留区域外的存储器.但该应用程序没有向内核询问此内存,因此将生成SegFault以进行内存保护.


ajs*_*410 6

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

在堆栈溢出期间,您耗尽了分配给某个段的所有空间,然后您的程序开始写入内存管理器不允许的段,然后您会遇到分段错误。

  • @SamB我不明白答案在哪里另有说法。"x86 内存管理器有许多遗留功能,其中之一就是分段" != "x86 发明了分段"。 (3认同)
  • x86 使用的分段(段寄存器)与操作系统执行的地址空间“分段”完全不同。分段错误与段寄存器无关。此外,尽管段寄存器长期以来一直是 x86 的一部分,但它对于 x86 在现代操作系统中的工作方式仍然非常重要。 (2认同)