前端之家收集整理的这篇文章主要介绍了
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语言并未指定应对此类情况进行尾
调用优化.但这将是特定于编译器的,并且与语言规范无关.
原文链接:https://www.f2er.com/c/117660.html