#include <stdio.h>
int main(void)
{
int (*fp)(void);
printf("Loopy.\n");
fp = &main; //point to main function
fp(); //call 'main'
return 0;
}
而不是无限地执行循环,“循环”在我的机器上执行大约10-20秒,然后获得标准的Windows应用程序崩溃报告。为什么是这样?
编译:GCC IDE:Code :: Blocks 操作系统:Win7 64位
答案 0 :(得分:8)
10..20秒即可。
每次函数通过函数指针递归调用自身时,都会创建一个新的堆栈帧。由于调用是间接完成的,编译器没有机会将尾调用优化为循环,因此程序最终会因堆栈溢出而崩溃。
如果您修改程序以在设定次数后停止循环,例如,通过设置计数器,您的程序将正确运行至完成(demo)。
#include <stdio.h>
int counter = 200;
int main(void)
{
int (*fp)(void);
printf("Loopy %d\n", counter);
fp = &main; //point to main function
if (counter--) {
fp(); //call 'main'
}
return 0;
}
答案 1 :(得分:1)
行为依赖于编译器它可能会在堆栈溢出之后崩溃,或者只是挂起而没有响应,但唯一的原因可能是在内存中推送太多堆栈帧堆