递归函数的内存分配

时间:2014-04-21 05:25:00

标签: c++ c memory memory-management recursion

调用递归函数时如何分配内存? 函数具有自己分配的内存。调用它时,参数(不是引用传递的参数)和变量获取内存。所以当从它的体内再次调用该函数时,如何将内存分配给第二次调用的变量和参数?

11 个答案:

答案 0 :(得分:9)

递归函数与任何其他函数没有区别 - 通过将堆栈指针推进到足以考虑其大小总和(以及对齐所需的任何填充),将自动局部变量分配为单个块。

每个递归调用以这种方式推送一个新的堆栈帧,然后在它返回时弹出它。如果递归无法达到基本情况,堆栈将很快耗尽,导致同名Stack Overflow崩溃。

答案 1 :(得分:1)

递归调用函数就像完成任何其他函数一样。因此,内存的分配方式与调用任何常规函数的方式相同。

答案 2 :(得分:1)

与调用任何其他函数相同。变量(不是引用传递的变量)在堆栈上分配。当函数开始返回时(即达到基本情况),堆栈将按照每次嵌套递归调用推送到堆栈的顺序弹出。

这个youtube视频非常好地解释了递归函数的调用堆栈:https://www.youtube.com/watch?v=k0bb7UYy0pY

答案 3 :(得分:1)

当一个函数(如果func1调用)调用另一个函数(称之为func2)时,执行func2所需的数据被推送到堆栈。对于递归函数,这不会改变(当func2func1相同时)。

如果递归函数以递归方式调用10次,则会有10个堆栈帧,每个帧对应于函数的一次调用。

答案 4 :(得分:1)

调用函数时,必要的参数被压入堆栈。当一个函数完成它的任务时,params将被激活并恢复程序计数器。

递归函数没有例外。

答案 5 :(得分:1)

在堆栈上分配函数参数和局部变量。他们组成了一个所谓的stack frame。当递归调用函数时,为函数的每个递归调用分配一个堆栈帧。

E.g。如果void f()以递归方式调用三次。

// Assume stack grows upwards
stack frame #3 <== the most recent call
stack frame #2
stack frame #1

答案 6 :(得分:1)

自动变量的内存分配在stack上。当你调用另一个函数(递归self或其他函数)时,到目前为止堆栈帧仍处于它们的状态,并且我们在堆栈上分配更多的内存(让我们这样说),以提供这个新函数的局部变量。当函数结束时,新的堆栈帧被丢弃,我们将恢复到之前的(calee)堆栈帧。

您可以使用您选择的任何调试器来更好地理解事物。如果您不明白,请询问。

答案 7 :(得分:1)

Recurtion使用堆栈内存来执行

完成以下示例

void rev(Node* head){
if(head==NULL) return;
head=head->next;
rev(head);
cout<<head->data<<endl;}

让我们看一下Stack Segment的递归。

NODE1 -> NODE2->NULL NODE1和NODE2是结构对象。

你的功能是:

Call to rev(NODE1)
Check if it is NULL
Point to next NODE i.e. NODE2

Call to rev(NODE2)

Check if It is NULL
Point to next NODE i.e. NULL

Call to rev(NULL)

Check if It is NULL
Pointer will be returned With head = NULL

希望这会帮助你。

答案 8 :(得分:1)

您编写的函数(代码行)存储在文本段中,当调用它时,它在堆栈内存中分配了一个帧,变量的内存(静态除外)也在给定帧的堆栈中分配。

递归函数与正常函数没有区别,它被调用n次。所以它的存储器(帧)也在堆栈上分配n次。

答案 9 :(得分:1)

调用函数时,其他函数状态的参数将保存在堆栈中。

在函数调用期间构造的堆栈帧包含以下内容:

  • 功能参数。
  • 功能的返回地址。
  • 帧指针。
  • 异常处理程序框架。
  • 本地声明的变量。
  • 缓冲器。
  • Callee保存寄存器。

答案 10 :(得分:0)

使用后需要释放内存。

这是一个示例程序,用于说明。

http://forums.devx.com/showthread.php?145311-Free-memory-or-garbage-in-recursion-program