C中有限的递归?

前端之家收集整理的这篇文章主要介绍了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();
}

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

解决方法

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

猜你在找的C&C++相关文章