Aru*_*iRC 27 c memory stack-overflow stack segmentation-fault
例如,当我们调用say,一个递归函数时,连续调用存储在堆栈中.但是,由于错误无效,因此错误是"分段错误"(如GCC所示).
它不应该是'堆栈溢出'吗?那两者之间的基本区别是什么?
顺便说一句,解释比维基百科链接更有帮助(经历过这一点,但没有特定查询的答案).
ken*_*ytm 58
堆栈溢出是[a]原因,分段错误就是结果.
至少在x86和ARM上,"堆栈"是一块内存,用于放置局部变量和返回函数调用的地址.当堆栈耗尽时,将访问保留区域外的存储器.但该应用程序没有向内核询问此内存,因此将生成SegFault以进行内存保护.
现代处理器使用内存管理器来保护进程免受彼此的影响。x86 内存管理器有许多遗留功能,其中之一就是分段。分段的目的是防止程序以某些方式操纵内存。例如,一个段可能被标记为只读,代码将放在那里,而另一个段是读/写的,这就是您的数据所在的位置。
在堆栈溢出期间,您耗尽了分配给某个段的所有空间,然后您的程序开始写入内存管理器不允许的段,然后您会遇到分段错误。