【问题标题】:Function Pointers - Why does this code crash?函数指针 - 为什么这段代码会崩溃?
【发布时间】:2014-07-28 04:45:19
【问题描述】:
#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:代码::块 操作系统:Win7 64位

【问题讨论】:

  • Working fine to me。无法复制。
  • 异常代码0xc00000fd 是堆栈溢出。你期待什么?
  • @AustinBrunkhorst 我期待一个无限循环,我正在试验。此外,与绝大多数人一样,我没有阅读崩溃详细信息:)。
  • 知道了,当你在堆栈上扩展内存时,你总是可以预料到堆栈溢出,但从不管理它。
  • “像绝大多数人一样”应该这样做

标签: c function pointers crash function-pointers


【解决方案1】:

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;
}

【讨论】:

  • 很棒的答案,最近有人教过堆栈帧,我应该看过!谢谢。
【解决方案2】:

行为是编译器相关它可能会在堆栈溢出后崩溃或只是挂在那里没有响应,但唯一的原因可能是在内存中推送了太多堆栈帧堆栈

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多