当我尝试访问存储在指针变量指向的地址中的值(地址)时,返回垃圾值。我已经发布了下面的代码和输出。
代码:
#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的值,但我的问题是为什么我不能以这种方式访问它。这是预期的行为吗?如果是的话,有人可以解释一下吗?谢谢。
答案 0 :(得分:2)
c = &b+1;
//...
*c
这是未定义的行为。在变量有效之后形成指向该位置的指针,但是通过它执行间接不是 1 。即使有些对象碰巧存在,编译器也可以自由地做任何想做的事情。
至于为什么打印1046514972
,这是0x3e608d1c
十六进制。它只是将64位指针的字节重新解释为32位整数。你碰巧得到了一些有意义的东西,但由于这是未定义的行为,它在语义上是垃圾。
1 从技术上讲,它是未定义的l-to-rvalue转换,但您不必担心。