c++ - 访问存储在指针变量指向的地址中的值(这是一个地址)返回垃圾值?

标签 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 的值,但我的问题是为什么我不能以这种方式访问​​它。这是预期的行为吗?如果是,有人可以解释一下吗?谢谢。

最佳答案

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

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

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


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

关于c++ - 访问存储在指针变量指向的地址中的值(这是一个地址)返回垃圾值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39081621/

相关文章:

c++ - boost::ptr_vector 是如何深拷贝底层对象的?

c - 将内存分配给双指针?

c++ - 更新指针?

c++ - <<<x,y>>> 在函数名和它的参数之间是什么意思?

c++ - 在保留类名的同时弃用类模板的正确程序是什么?

c++ - 循环和对象初始化问题(C++)

c++ - 警告 : uninitialized variable//But I have initialized ! C++ 编译器错误?

c - 下面的代码可能有什么问题,在 c 中给出了段错误

c++ - 映射值的地址

c++ - 二叉树插入指针问题