C:太大的堆栈会导致分段错误吗?

Rol*_*uhs 5 c memory-management

最近调试了一个很奇怪的问题,导致了segmentation fault。

基本上,在我将几个被声明为局部变量的非常大的数组移动到全局变量后,问题就消失了,这意味着据我所知,我将它们从堆栈移动到了堆空间。没有其他任何改变。分段错误本身出现在非常旧且稳定的代码中,这些代码也被其他没有遇到任何分段错误的程序共享。

总的来说,这些阵列的大小约为 1.5 MB。

过大的堆栈是否可能通过覆盖/弄乱函数指针而导致分段错误?

我的感觉是这样的事情应该被编译器捕获,但我绝对没有其他方法来解释这种行为。

平台为 Linux (Ubuntu 18.04)

dbu*_*ush 5

程序的堆栈大小是有限的,因此声明太多大数组作为局部变量可能会导致堆栈溢出。你所做的就是处理这个问题的好方法。

这不是编译器通常检查的内容,因为堆栈大小在运行时由操作系统控制,例如或ulimit -s在Linux 系统上。手册页声明了以下有关堆栈大小的内容:getrlimitsetrlimitgetrlimit

RLIMIT_STACK

进程堆栈的最大大小(以字节为单位)。达到此限制后,会生成 SIGSEGV 信号。要处理此信号,进程必须使用备用信号堆栈 (sigaltstack(2))。

因此,在 Linux 上,堆栈的大小是运行时设置,超出堆栈会明确导致分段违规。