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

标签 c memory-management

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

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

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

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

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

平台为 Linux (Ubuntu 18.04)

最佳答案

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

这不是编译器通常会检查的内容,因为堆栈大小在运行时由操作系统控制,例如 ulimit -sgetrlimit/setrlimit在 Linux 系统上。 man page for getrlimit 关于堆栈大小的说明如下:

RLIMIT_STACK

The maximum size of the process stack, in bytes. Upon reaching this limit, a SIGSEGV signal is generated. To handle this signal, a process must employ an alternate signal stack (sigaltstack(2)).



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

关于C:太大的堆栈会导致段错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60707151/

相关文章:

c - C中的Posix正则表达式匹配...全匹配异常?

c - 在线程中使用时,recvfrom() 对于 RAW 套接字返回 -1?

c++ - 让基于 makefile 的 cmake 项目在环境变量更改时自动运行 make rebuild_cache

java - 使用 JNI 将 int[] 从 java 返回到 C

C++ 堆分配和内存重用

在 C 中为 malloc 和 free 创建一个包装函数

c++ - std::map 分配器绑定(bind)到所有键和值的堆?

C-当我在解释器/编译器中需要它时,在结构中的另一种类型上使用指针

java - RAM 内存重新分配 - Windows 和 Linux

c - 即使在我释放它之后,Valgrind 也发现了字符串的内存泄漏