可能的重复问题:
什么是分段错误和堆栈溢出之间的区别?
我想知道为什么堆栈溢出会导致分段错误而不是堆栈溢出。
这是因为超过了栈限制的范围,导致了SIGSEGV吗?为什么在Linux中我们不会遇到堆栈溢出,而是遇到了分段错误?
int foo()
{
return foo();
}
这段小代码本应该会导致栈溢出,但实际上在Linux中导致了分段错误。
可能的重复问题:
什么是分段错误和堆栈溢出之间的区别?
我想知道为什么堆栈溢出会导致分段错误而不是堆栈溢出。
这是因为超过了栈限制的范围,导致了SIGSEGV吗?为什么在Linux中我们不会遇到堆栈溢出,而是遇到了分段错误?
int foo()
{
return foo();
}
这段小代码本应该会导致栈溢出,但实际上在Linux中导致了分段错误。
堆栈溢出可能导致几种不同类型的硬件错误。
SIGSEGV
(段错误)信号。SIGILL
(非法指令)信号。SIGBUS
(例如:对齐异常)。所有这些错误都发生在堆栈溢出之后。一种方法是添加堆栈溢出保护(ProPolice 等),以便在它们导致更严重的问题之前捕获堆栈溢出。
编辑:
你指的是“真正的堆栈溢出”。嗯,这种情况已经被 SEGV(尝试访问进程没有权限的内存)所覆盖,因此它会收到 SEGV,而不是特殊处理更通用的 SEGV 的每个单独情况。
longjmp
恢复相对安全,前提是正在执行的代码本身就可以安全地跳出 longjmp
。 - R.. GitHub STOP HELPING ICEStackoverflow并不是一个错误,它是一种情况,从语言到平台不同,它抛出的错误也会有所不同。
在维基百科上了解更多关于分段错误的信息。
编辑:
更明确地说,在您的情况下,调用堆栈已溢出,程序尝试将下一个调用写入无效地址,导致发生分段错误。