函数指针 - 为啥这段代码会崩溃?

Posted

技术标签:

【中文标题】函数指针 - 为啥这段代码会崩溃?【英文标题】: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 我期待一个无限循环,我正在试验。此外,与绝大多数人一样,我没有阅读崩溃详细信息:)。 知道了,当你在堆栈上扩展内存时,你总是可以预料到堆栈溢出,但从不管理它。 “像绝大多数人一样”应该这样做 【参考方案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】:

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

【讨论】:

以上是关于函数指针 - 为啥这段代码会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用函数指针调用函数会绕过钩子?

c语言 这段代码是啥意思,结果为啥是20,20

指针的基础进阶

当我尝试重新分配()结构指针数组时,为啥我的 C 程序会崩溃?

为啥#define _LARGEFILE_SOURCE 会破坏这些函数指针?

基类构造函数的派生类成员初始化