void函数中不写return语句会占用栈内存吗?

Posted

技术标签:

【中文标题】void函数中不写return语句会占用栈内存吗?【英文标题】:Does not writing return statement in void function occupies the stack memory? 【发布时间】: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; 【参考方案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”。

【讨论】:

以上是关于void函数中不写return语句会占用栈内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

java 函数(方法)

main函数中不写public可以吗?

JAVA中,如果是无返回值的函数(void),return;是否可以省略不写

java基础之异常——try{}里面有一个return语句,那么紧跟在try后的return语句还会执行吗?什么时候执行,在return前还是后?

js基础学习

如何解决栈溢出