C ++指针输出一致性

时间:2018-04-15 14:49:34

标签: c++ c++11

我正在尝试学习C ++中的指针。我正在运行以下代码来查看不同指针中的地址和值

#include <iostream>

using namespace std;

int main() {

    int x=10;
    int *p = &x; 

    char c2 = 'c';
    char *p2 = &c2;

    //cast to void pointer to see address in p2
    void *p3 = static_cast<void *>(p2); 

    cout<<"Address in p2/p3:"<< p3 <<endl;
    cout<<"Content of address in p2/p3:"<< *(static_cast<int *>(p3))<<endl;

}

在最后一行中,您可以看到我正在将一个void指针转换为int指针。我期待在运行程序时始终打印垃圾值。但令我惊讶的是,它始终打印2659.我尝试了不同的在线编译器,它打印2659。 然后我尝试删除以下两行,

int x=10;
int *p = &x; 

然后,它每次运行时都开始打印垃圾值。但是指针p3现在与x和p有关。有人可以解释这里发生的事情。

提前致谢。

2 个答案:

答案 0 :(得分:5)

内存布局是这样的,10(小端)紧跟着&#39; c&#39; (ASCII 99)和10 * 256 + 99 = 2659。

在许多情况下,UB是非常可预测的行为。

答案 1 :(得分:0)

您违反了严格的别名规则。由于p3最终指向char,因此您无法static_castint*并获得可靠的结果。 的工作原理是static_castchar *(实际类型p3指向):

    cout<<"Content of address in p2/p3:"<< *(static_cast<char *>(p3))<<endl;