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 >= 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中,如果是无返回值的函数(void),return;是否可以省略不写
java基础之异常——try{}里面有一个return语句,那么紧跟在try后的return语句还会执行吗?什么时候执行,在return前还是后?