CS *_*ent 5 c crash pointers function-pointers function
#include <stdio.h>
int main(void)
{
int (*fp)(void);
printf("Loopy.\n");
fp = &main; //point to main function
fp(); //call 'main'
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而不是无限地执行循环,"循环"在我的机器上执行大约10-20秒,然后获得标准的Windows应用程序崩溃报告.为什么是这样?
编译器:GCC IDE:Code :: Blocks OS:Win7 64bit
只要计算机溢出堆栈,10..20秒就足够了.
每次函数通过函数指针递归调用自身时,都会创建一个新的堆栈帧.由于调用是间接完成的,编译器没有机会将尾调用优化为循环,因此程序最终会因堆栈溢出而崩溃.
如果您修改程序以在设定次数后停止循环,例如,通过设置计数器,程序将正确运行至完成(演示).
#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;
}
Run Code Online (Sandbox Code Playgroud)