堆栈溢出和分段故障

时间:2011-08-18 20:44:37

标签: c recursion stack-overflow runtime-error

当这种无限递归运行时,Stack溢出会在这种情况下产生分段错误。我期待像“Stack Overflow”这样的错误消息!

#include <stdio.h>
int main(){
static int a=1;
printf("%d\n",a);
a++;
main();
return 0;
}

4 个答案:

答案 0 :(得分:4)

它会导致分段错误,因为堆栈会溢出。

每次调用main都会将更多数据推送到堆栈中,以便程序知道returnmain()开始跳转到哪里。最终,您将耗尽堆栈空间(堆栈溢出)。此时,您对main的下一次调用将尝试将数据推送到堆栈。由于没有更多的堆栈空间可用,它将意外写入无效的内存位置,从而触发分段错误。这与您在数组末尾写入时类似。

答案 1 :(得分:2)

堆栈溢出是原因;堆栈溢出的效果(在许多情况下)是分段错误。这取决于操作系统,体系结构和运行时环境,创建错误消息的代码是否能够从导致堆栈溢出的影响中推断出来。但大多数人都懒得去尝试。

答案 2 :(得分:0)

与其他人发布之前,它取决于环境(操作系统,硬件,编译器等)。根据此情况,错误消息可能无法反映实际原因(通常在执行无效的内存访问时)。也就是说,在像valgrind这样的东西中运行它应该总能给你关于这种访问原因的可靠信息。

答案 3 :(得分:-2)

你只是在做一个int溢出。

达到最大值后,继续减去值。

这个递归会粉碎你调用堆栈!

void lol()
{
lol();
}

这是缓冲区溢出: https://www.owasp.org/index.php/Buffer_Overflow

这不是编程错误,而是一些安全问题。

就像你没有验证密码输入len一样,如果len声明为char [6],那个人会发送4000000个字符,这些字符将溢出你的char *。