我正在尝试学习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有关。有人可以解释这里发生的事情。
提前致谢。
答案 0 :(得分:5)
内存布局是这样的,10(小端)紧跟着&#39; c&#39; (ASCII 99)和10 * 256 + 99 = 2659。
在许多情况下,UB是非常可预测的行为。
答案 1 :(得分:0)
您违反了严格的别名规则。由于p3
最终指向char
,因此您无法static_cast
到int*
并获得可靠的结果。 应的工作原理是static_cast
到char *
(实际类型p3
指向):
cout<<"Content of address in p2/p3:"<< *(static_cast<char *>(p3))<<endl;