Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux会告诉我是否有堆栈溢出吗?_C_Memory Leaks_Stack Overflow_Valgrind - Fatal编程技术网

C linux会告诉我是否有堆栈溢出吗?

C linux会告诉我是否有堆栈溢出吗?,c,memory-leaks,stack-overflow,valgrind,C,Memory Leaks,Stack Overflow,Valgrind,请记住,我对C和linux比较陌生 在我的一个课程中,我有一个项目,我们应该找到哪个城市位于某个地理框中,我们必须使用二进制搜索树,尽管实现取决于我们。在我的特定实现中,当向树中插入新元素时,我递归地调用相应子树上的插入函数 我们还被告知使用Valgrind检查我们的程序,因为任何内存泄漏或错误都会对我们的成绩产生负面影响。我的程序可以很好地处理cities文件,我们已经得到了100000个,但是在1000000个cities时,Valgrind抛出了超过一百万个由无效读/写引起的错误,堆栈溢出

请记住,我对C和linux比较陌生

在我的一个课程中,我有一个项目,我们应该找到哪个城市位于某个地理框中,我们必须使用二进制搜索树,尽管实现取决于我们。在我的特定实现中,当向树中插入新元素时,我递归地调用相应子树上的插入函数

我们还被告知使用Valgrind检查我们的程序,因为任何内存泄漏或错误都会对我们的成绩产生负面影响。我的程序可以很好地处理cities文件,我们已经得到了100000个,但是在1000000个cities时,Valgrind抛出了超过一百万个由无效读/写引起的错误,堆栈溢出。如果我使用更大的堆栈大小运行Valgrind,则不会发生这种情况

但是,当我在没有Valgrind的情况下直接运行程序时,我没有得到任何错误。linux会告诉我是否有堆栈溢出吗?这样的溢出会有什么后果

为什么不测试一下呢? 通过以下程序,我有时会得到一个
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