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