在这种情况下,为什么void指针的行为与普通整数指针不同?

时间:2019-05-17 11:06:31

标签: c++ c++11

正如问题所述,有人可以解释以下行为

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指针的正确理解。有人可以解释吗?

2 个答案:

答案 0 :(得分:2)

在:

X foo(int v){
    X x;
    x.p = &v;
    x.q = &v;
    return x;
}

它使用局部变量v的地址,该地址在函数返回时被销毁,并且最终导致无效的指针。取消引用此类指针是未定义的行为。

答案 1 :(得分:0)

void*无关,在foo()中,您要获取被破坏的局部变量的地址。那是不确定的行为,任何事情都可能发生。