主递归调用,不带局部变量

时间:2019-03-18 01:12:41

标签: c

以下内容的输出是什么

int main() 
{
    printf ("welcome");    
    main ();    
    return;    
}    

选项:

  1. Main被称为无限次
  2. 主要被叫65535次。
  3. 主要被称为32765次。
  4. 堆栈溢出。
  5. 编译错误。

我的分析:我认为方案1是正确的。选项2,3和5绝对不是。我也不认为选项4也是如此。原因,我相信如果主函数使用一些消耗内存的局部变量,可能会发生堆栈溢出。因此,我认为选项1是正确的选择!我同意递归函数会导致堆栈溢出,但这也取决于函数实现的内容。在这种情况下,仅打印printf。请让我知道您对此的反馈。谢谢!

4 个答案:

答案 0 :(得分:2)

这取决于实现。该语言没有说明函数调用的实现方式,它们只需要为有效程序产生正确的结果即可。

在大多数实现中,我期望#4。即使您没有局部变量,它仍然需要一个堆栈框架来保存返回位置。

如果您的函数是尾部递归的,并且编译器优化了尾部调用,则可以避免堆栈溢出。为此,该功能必须以以下结尾:

return main();

答案 1 :(得分:2)

显然是compilation error,因为该函数返回一个整数,而您的返回未返回任何内容。

intvoid不兼容。

假设您将正确返回,它将是stack overflow,因为您需要堆叠返回的值-在无限递归调用之后无法在此处应用尾部优化,因此无法在迭代中进行转换

答案 2 :(得分:0)

暂时忽略递归调用main并不是一个好主意,如果运行此代码,最终将导致堆栈溢出。

即使没有局部变量,堆栈仍需要跟踪函数的返回地址。该返回地址将累加起来,最终使堆栈崩溃。

答案 3 :(得分:0)

由于返回类型int的函数未返回任何值,因此这将是您的第一个编译错误。

还有一种情况是堆栈溢出,因为每次调用main()时,堆栈都会存储要在main之后执行的return语句的地址,在这种情况下您不会发生这种情况,然后函数再次调用自身。

因此,每个调用堆栈之后都会有return语句的地址。