C linux会告诉我是否有堆栈溢出吗?
请记住,我对C和linux比较陌生 在我的一个课程中,我有一个项目,我们应该找到哪个城市位于某个地理框中,我们必须使用二进制搜索树,尽管实现取决于我们。在我的特定实现中,当向树中插入新元素时,我递归地调用相应子树上的插入函数 我们还被告知使用Valgrind检查我们的程序,因为任何内存泄漏或错误都会对我们的成绩产生负面影响。我的程序可以很好地处理cities文件,我们已经得到了100000个,但是在1000000个cities时,Valgrind抛出了超过一百万个由无效读/写引起的错误,堆栈溢出。如果我使用更大的堆栈大小运行Valgrind,则不会发生这种情况 但是,当我在没有Valgrind的情况下直接运行程序时,我没有得到任何错误。linux会告诉我是否有堆栈溢出吗?这样的溢出会有什么后果 为什么不测试一下呢? 通过以下程序,我有时会得到一个C linux会告诉我是否有堆栈溢出吗?,c,memory-leaks,stack-overflow,valgrind,C,Memory Leaks,Stack Overflow,Valgrind,请记住,我对C和linux比较陌生 在我的一个课程中,我有一个项目,我们应该找到哪个城市位于某个地理框中,我们必须使用二进制搜索树,尽管实现取决于我们。在我的特定实现中,当向树中插入新元素时,我递归地调用相应子树上的插入函数 我们还被告知使用Valgrind检查我们的程序,因为任何内存泄漏或错误都会对我们的成绩产生负面影响。我的程序可以很好地处理cities文件,我们已经得到了100000个,但是在1000000个cities时,Valgrind抛出了超过一百万个由无效读/写引起的错误,堆栈溢出
SIGSEGV
,有时则没有:
#include <stdint.h>
uint64_t pos=261950;
int main(void)
{
volatile int a; //just some variables to use the stack
volatile int b; //and avoid too much optimizations
a=b; b=a;
if(pos)
{
pos--;
main();
}
return 0;
}
当变量pos
较大时,我总是看到一条SIGSEGV
-消息
当然,这里没有什么不好的事情发生,但是您不能确定它如何在一个更复杂的程序中结束,所以要避免不受控制的深层递归
linux会告诉我是否有堆栈溢出吗
不,Linux不关心堆栈是否溢出。但是,它确实尝试确保堆栈末尾以外的内存地址是未映射的内存,因此可能会出现库存溢出。(这取决于每个函数堆栈帧的大小;如果运气不好,在堆栈上分配大数组可能会产生其他as症状。)
C运行时环境可能也不会告诉您,因为它需要插入额外的代码,这会降低执行速度,而那些注意确保堆栈不会溢出的程序员会抱怨必须为保护代码不受bug影响而支付费用。这听起来可能有些刺耳,但基本上是C语言的设计理念;如果你不喜欢,还有其他语言。但是,有些编译器确实允许您请求插入额外的代码(使用GCC,请参阅
-fstack check
选项;另请参阅-fstack limit-*
和-fsplit stack
)内存管理硬件将引发segfault中断。下面是一篇关于Linux中堆栈溢出的有趣文章。如何发生或发生什么并不重要,堆栈溢出可能会影响您,可能是现在,也可能是将来。由于您已经生活在边缘:现在是从程序中删除递归的时候。如果您无法控制递归调用的最大数量,请避免递归。默认情况下,有关stackoverflow上堆栈溢出的问题必须获得向上投票;)
gcc -Wall -Wextra 001.c