我最近在C ++类中得到了递归,我想知道变量的范围是特定堆栈框架的本地是正确的:
3)返回
2)flipString(“”); begin = a,end = t
1)flipString(at); begin = s,end = r
所以当它到达return语句时它会弹出 第三帧关闭,
然后第二帧关闭,s = t +“”+ a
然后是s = r + at + s的第一帧,从而反转字符串。
void flipString(string &s)
{
if (s.size() < 2)
{
return;
}
else
{
string begin;
string end;
begin = s.at(0);
end = s.at(s.size()-1);
s.erase(s.begin());
s.erase(s.end()-1);
flipString(s);
s = end + s + begin;
}
return;
}
答案 0 :(得分:2)
是的,您对该功能如何工作以及功能本身看似正确的想法。
在函数的每次调用中,有一个不同的局部变量实例开始和结束,放在堆栈上。
函数参数s引用或指向所有堆栈帧中的相同字符串,因为它是一个引用。
如果传递普通函数参数(没有引用而不是指针),那么在每个调用堆栈级别也会有一个单独的参数副本。
答案 1 :(得分:1)
在这种情况下,有三种符号类型需要理解:
了解值的存储位置以及堆栈的工作方式也很有用。
为每个函数调用创建一个堆栈帧。这为函数的执行创建了一个上下文,并引用了调用者的上下文。当函数退出时,删除(弹出)函数的堆栈帧并恢复调用者的上下文。
正式参数&#39;位置保留在被调用函数的堆栈帧中。类似地,局部变量存储在函数的堆栈帧中。实际参数或对它们的引用被复制到堆栈,在那里它们可以由它们的形式参数对应物引用。
当函数退出时,堆栈框架将与形式参数和局部变量空间一起释放。
请注意,对于作为引用(&
)传递给实际值的参数,值的空间可能存在于当前堆栈帧之外(只有引用地址本身位于堆栈帧内)。忘记这一点可能会让人混淆为什么值在函数调用中持久化。对于指针来说这更为明显,但在传递引用时可能会被忽略。