正如问题所述,有人可以解释以下行为
class X{
public:
int *p;
void *q;
void goo(int v);
};
void X::goo(int v){
p = &v;
q = &v;
}
X foo(int v){
X x;
x.p = &v;
x.q = &v;
return x;
}
int main(int argc, char const *argv[])
{
X x = foo(10);
cout << *x.p << " " << *(int *)x.q << endl;
x.goo(3);
cout << *x.p << " " << *(int *)x.q << endl;
return 0;
}
输出
10 0
3 32764
void指针的行为是变量的预期行为
通过引用传递...
class X{
public:
int *p;
void *q;
void goo(int &v);
};
void X::goo(int &v){
p = &v;
q = &v;
}
X foo(int &v){
X x;
x.p = &v;
x.q = &v;
return x;
}
int main(int argc, char const *argv[])
{
int a = 10;
X x = foo(a);
cout << *x.p << " " << *(int *)x.q << endl;
int b = 3;
x.goo(b);
cout << *x.p << " " << *(int *)x.q << endl;
return 0;
}
输出
10 10
3 3
为什么在第一种情况下,void和int指针的行为不同。我认为我缺乏对c / c ++中的void指针的正确理解。有人可以解释吗?
答案 0 :(得分:2)
在:
X foo(int v){
X x;
x.p = &v;
x.q = &v;
return x;
}
它使用局部变量v
的地址,该地址在函数返回时被销毁,并且最终导致无效的指针。取消引用此类指针是未定义的行为。
答案 1 :(得分:0)
与void*
无关,在foo()
中,您要获取被破坏的局部变量的地址。那是不确定的行为,任何事情都可能发生。