我跑了这个程序,然后输出
...
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语言并未指定应对此类情况进行尾调用优化.但这将是特定于编译器的,并且与语言规范无关.