c - 函数指针 - 为什么这段代码会崩溃?

标签 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:代码:: block 操作系统:Win7 64位

enter image description here

最佳答案

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/

相关文章:

c - 是否可以在普通的 `void *` 中设计没有 `c` 指针的通用数据结构?

c - 在 C 中更新结构数组失败

c - C 中参数的默认值

c++ - 使用指针时的注意事项

C - 多进程的内存映射

c - 根据命令行参数为数组分配内存的正确方法是什么?

c++ - 将重载函数与其多态参数匹配

javascript - 如何使用 JS 数组元素来定义对使用参数的函数的调用

C 数组 64 位递增

c++ - 为什么指针的指针声明有不同的编号。当大小相同时为星号