roy*_*las 1 c++ pointers reinterpret-cast
以下代码中的前两行输出是两个空白行,第三行和第四行是两个不相等的大数字,如:19147336 19147192
class A {
public:
A() : m_i(0) { }
protected:
int m_i;
};
class B {
public:
B() : m_d(0.0) { }
protected:
double m_d;
};
int main() {
A *pa = new A;
B *pb = new B;
std::cout << reinterpret_cast<char*>(pa) << std::endl;
std::cout << reinterpret_cast<char*>(pb) << std::endl;
std::cout << (int)reinterpret_cast<char*>(pa) << std::endl;
std::cout << (int)reinterpret_cast<char*>(pb) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道上面代码中reinterpret_cast的返回是什么.谢谢!
你正在做未定义的行为.编译器可以自由地生成完全可以执行任何操作的代码,包括创建一个机器人,以便及时回到K&R的父母那里,并在早上吃药以防止C首先被发明.
另外,在上述前两种情况,编译器代替解释的字节int和一个double具有值0作为字符的空终止阵列,并把它看作一个0长度的缓冲区,因此在打印什么.
在第二组转换(int)案例中,它给出了sizeof(int)从中获取的指针值的低字节的整数表示new.
这些都不令人惊讶,但这些都不能依赖.从严格别名到优化,编译器在您处理未定义的行为时可能会做疯狂的事情,即使您没有附加时间机器或机器人,UB的效果也可能在UB运行的代码之前发生.