我最近想过这种堆栈溢出的情况:
int f()
{
return f();
}
int main(void)
{
f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这肯定会导致程序崩溃.但我的问题是为什么这与无限循环不一样?在返回行的递归调用的情况下,编译器可以意识到不需要保留调用函数的任何信息,因为被调用函数的返回点与调用者的返回点相同.现在,在这种情况下,我同意编译器需要保留在堆栈中进行调用的函数的信息:
int f()
{
int x = f();
return x;
}
int main(void)
{
f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,我错过了一些东西,如果有人向我解释,我会很感激.问候