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

时间:2014-06-06 20:07:54

标签: c function pointers crash function-pointers

#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位

enter image description here

2 个答案:

答案 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)

行为依赖于编译器它可能会在堆栈溢出之后崩溃,或者只是挂起而没有响应,但唯一的原因可能是在内存中推送太多堆栈帧堆