C中有限的递归?

fun*_*ptr 6 c

我跑了这个程序,然后输出

...

65088
65089
65090

然后它停了下来.Windows 7称a.exe停止工作.这是代码:

#include <stdio.h>

void go(void);

main()
{
    go();
}

void go(void)
{
    static int i = 0;
    printf("%d\n", i++);
    go();
}
Run Code Online (Sandbox Code Playgroud)

我认为这个程序应该由于递归而无限期地打印数字,但它会在65090停止!C代码是用gcc编译的.有任何想法吗?

Jas*_*son 14

您将在某个时刻溢出堆栈,因为go()即使您没有向函数调用传递任何参数,每次调用都必须在堆栈上推送返回地址.因此,每次调用都会go()在堆栈上占用指针大小的块以获取该返回地址.由于堆栈的大小有限,这意味着在某些时候你将耗尽空间.虽然有些编译器(如gcc)通过优化开关提供该选项,但C语言并未指定应对此类情况进行尾调用优化.但这将是特定于编译器的,并且与语言规范无关.


cni*_*tar 10

它会因为堆栈溢出而停止.一旦溢出堆栈,结果就不确定了.


mah*_*mah 7

您无法在具有有限资源的计算机上无限递归 - 特别是堆栈.每个嵌套的子程序调用都需要更多的堆栈空间,最终你会耗尽.