【问题标题】:Does not writing return statement in void function occupies the stack memory?void函数中不写return语句会占用栈内存吗?
【发布时间】:2017-02-10 17:46:30
【问题描述】:

这是一个快速排序算法的简单递归函数,我没有在这个函数中找到return语句,所以最后一次递归后它不会清空堆栈吗?

void quicksort(int arr[], int p, int r){
    int q = partition(arr, p, r);
    if(p < r){
        quicksort(arr,p, q-1);
        quicksort(arr,q+1, r);
    }
}

这个函数没有返回语句,所以递归函数会永远留在堆栈上还是会被清空?

【问题讨论】:

  • p &gt;= r时递归结束。
  • 在结束 } 之前有一个隐含的 return 语句。一般来说,记住做蠢事的工具(语言、编译器)往往会很快消亡。
  • 它是一个void 函数,所以它不会有任何返回值。此外,通常是清理堆栈的调用者代码而不是函数代码。最后,void 函数的末尾总是有一个隐含的 return;

标签: c recursion stack quicksort void


【解决方案1】:

函数的堆栈帧在最终退出时被清除

不需要显式的return 语句来发生这种情况;当程序流遇到右括号时,函数无论如何都会退出,并且它的堆栈帧将被清除。

函数可以在没有return 的情况下退出的另一种典型方式(尽管不是在 C 中)是抛出异常;再次,堆栈帧将被清除。

【讨论】:

  • 我会使用短语“当它最终返回”而不是“当它最终退出”以确保任何未来的读者不会将return 语句与exit 调用混淆。
  • @AndrewHenle 有趣的是,我专门选择了“退出”这个词而不是“返回”,以避免与 return 语句产生任何歧义。 :D
  • @AndrewHenle 我认为没有混淆,因为他指的是函数 (it) 而不是过程。
  • @Jon 我担心没有经验的 C 编码人员不知道 void 函数的隐式 return
【解决方案2】:

通常,void 函数中的return 语句仅在您希望在到达函数体末尾之前返回的情况下是必需的。最后一行return 语句是多余的,可以忽略。无论是否使用return,都将清理堆栈。

【讨论】:

    【解决方案3】:

    这个函数没有返回语句,递归函数也一样 永远留在堆栈上,否则它们会被清空吗?

    在 void 函数的情况下,当代码结束时,它就结束了。这里,void 函数将在 p >= r 时结束。堆栈帧结束时应被删除。 代码末尾的最后一个右花括号“}”是隐式返回语句,因此不需要返回。

    对于 void 函数,最后不需要明确的“返回”。但是,如果在到达 function/code 末尾之前在某些条件下应该提前退出,您可以在 void 函数中使用“return”。如果您想避免函数在何处结束作为编码指南/实践的歧义,您也可以在 void 函数末尾使用“return”。

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 2012-12-09
      • 2014-04-05
      • 2019-03-09
      • 2015-09-21
      • 1970-01-01
      相关资源
      最近更新 更多