功能指针 - 为什么此代码崩溃?

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

在此输入图像描述

das*_*ght 8

只要计算机溢出堆栈,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)