void recur(int arr[], int l, int m, int r)
{
int L[4], R[4];
// some statements
recur(/*those arguments*/); //say.
}
现在,如果我以递归方式调用recur()
函数,L[4]
,R[4]
将为每次递归调用获取相同的内存地址,否则每次调用将占用不同的内存地址。
答案 0 :(得分:2)
答案是否定的。每次调用函数(任何函数)都会创建一个新的堆栈帧,其中包含用于局部变量的新内存,无论谁调用该函数(相同的函数或另一个函数)。这意味着不同的内存地址。
大多数时候这个答案都是正确的。然而,正如巧妙评论的那样,当函数做的最后一件事就是调用自身时,大多数编译器都会执行尾调用优化并消除对所有堆栈的需要,对所有调用使用相同的堆栈,使用不同的参数。
在此处阅读更多内容:Stack Frame。
答案 1 :(得分:1)
考虑到它不是Tail Call或Tail Call Optimisation,那么简短的回答是否。但是,如果是TCO则是。感谢@lorro指出它!
void recur(int arr[], int l, int m, int r)
{
int L[4], R[4];
// some statements
recur(/*those arguments*/); //say.
}
递归中的变量不要采用相同的内存地址。 每个函数调用都为函数创建一个新的“激活记录”,它包含它自己的堆栈,其中存储了堆栈动态变量。
在此处阅读更多内容:Activation Records