存储在指针变量指向的地址中的访问值(地址)会返回垃圾值吗?

时间:2016-08-22 14:03:38

标签: c++ pointers

当我尝试访问存储在指针变量指向的地址中的值(地址)时,返回垃圾值。我已经发布了下面的代码和输出。

代码:

#include<iostream>

using namespace std;

int main(){
    int *a, b=10, *c;
    a = &b;
    c = &b+1;

    cout << "Address of A : " << &a << endl;
    cout << "Value of A : " << a << endl;
    cout << "Value pointed by A : " << *a << endl;
    cout << "Address of B : " << &b << endl;
    cout << "Value of B : " << b << endl;
    cout << "Value of C : " << c << endl;
    cout << "Value pointed by C : " << *c << endl;

    return 0;
}

输出:

Address of A : 0x7fff3e608d20
Value of A : 0x7fff3e608d1c
Value pointed by A : 10
Address of B : 0x7fff3e608d1c
Value of B : 10
Value of C : 0x7fff3e608d20
Value pointed by C : 1046514972

在上述程序中,c指向的地址是a的地址,*c的地址为垃圾值1046514972,而不是0x7fff3e608d1c

我知道,我可以通过其他方式访问A的值,但我的问题是为什么我不能以这种方式访问​​它。这是预期的行为吗?如果是的话,有人可以解释一下吗?谢谢。

1 个答案:

答案 0 :(得分:2)

c = &b+1;
//...
*c

这是未定义的行为。在变量有效之后形成指向该位置的指针,但是通过它执行间接不是 1 。即使有些对象碰巧存在,编译器也可以自由地做任何想做的事情。

至于为什么打印1046514972,这是0x3e608d1c十六进制。它只是将64位指针的字节重新解释为32位整数。你碰巧得到了一些有意义的东西,但由于这是未定义的行为,它在语义上是垃圾。

1 从技术上讲,它是未定义的l-to-rvalue转换,但您不必担心。