请考虑以下代码:
int * p;
void Set()
{
int i = 7;
p = & i; // potentially disastrous
}
我知道指向可能被覆盖的值很糟糕但我记得有一种方法可以防止像i这样的值在声明时丢失,然后以这种方式指向。我已经仔细检查了我的教科书,但却无法找到详细说明的文字,而且我开始认为我甚至可能已经想到了它。有没有办法安全地指向函数内部声明的临时值?一种使临时价值不再是暂时的方法吗?
提前感谢您的所有帮助!
答案 0 :(得分:4)
我记得有一种方法可以防止像i这样的值在声明时丢失,然后用这种方式指出
与你提到的最接近的事情(如果我理解你的句子正确)是允许在绑定到引用时延长临时的生命周期的规则(§ 12.2 / 5的C ++ 11标准):
struct X { int x = 0; };
X foo() { return X(); }
int main()
{
X const& x = foo(); // The lifetime of the object bound to x is prolonged
x.x = 42; // This is OK
}
但是,指针和非临时对象没有这样的规则。
一种使临时价值不再是暂时的方法吗?
在您的示例中,i
不是临时的:它是自动存储持续时间的对象。临时是一个对象,其生命期(通常)终止于创建它的完整表达式的末尾(除了上面提到的例外,还有一些在第12.2 / 4-5节中列出)。
答案 1 :(得分:2)
将const ref暂时延伸到此临时值的临时延长时间,直到此const引用的范围结束,但是在您的示例中,您没有获取临时但本地自动对象i
的地址。
所以要延长临时的生命周期:
const int& iref=int(3);
int a= iref;
//..do stuff with iref, i.e:
printf("iref: %d\n", a);
输出:
iref:3
RUN SUCCESSFUL(总时间:46ms)
答案 2 :(得分:1)
i
的值必须驻留在某处的内存中。如果在函数内部声明它,它很可能在堆栈上分配,并在函数返回时丢失。如果你真的需要值在你的例子中总是保持不变,那么你需要的是在函数外面将它声明为static const:
int * p;
static const int i = 7;
void Set()
{
p = & i;
}
如果这不是您所需要的,也许您可以对最小的示例代码进行详细说明,以便我们更好地了解您要实现的目标。
答案 3 :(得分:1)
您可以使用static
关键字。
#include <stdio.h>
int *p;
void set() {
static int x = 7;
p = &x;
}
int main(){
set();
printf("%d", *p);
}
正确打印7。
但是,除了对静态关键字和指针的研究之外,我强烈建议不要使用这样的代码。