当这种无限递归运行时,Stack溢出会在这种情况下产生分段错误。我期待像“Stack Overflow”这样的错误消息!
#include <stdio.h>
int main(){
static int a=1;
printf("%d\n",a);
a++;
main();
return 0;
}
答案 0 :(得分:4)
它会导致分段错误,因为堆栈会溢出。
每次调用main都会将更多数据推送到堆栈中,以便程序知道return
从main()
开始跳转到哪里。最终,您将耗尽堆栈空间(堆栈溢出)。此时,您对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 *。