#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:代码:: block 操作系统:Win7 64位
最佳答案
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;
}
关于c - 函数指针 - 为什么这段代码会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24089865/