Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当涉及到不相关的类时,如何重新解释?_C++_Pointers_Reinterpret Cast - Fatal编程技术网

C++ 当涉及到不相关的类时,如何重新解释?

C++ 当涉及到不相关的类时,如何重新解释?,c++,pointers,reinterpret-cast,C++,Pointers,Reinterpret Cast,以下代码中输出的前两行是两个空行,第三行和第四行是两个不相等的大数字,如: 19147336 19147192 我想知道上面代码中reinterpret_cast的返回结果到底是什么。谢谢 您正在进行未定义的行为。编译器可以自由地生成可以做任何事情的代码,包括创建一个机器人,让它回到过去,给K&R的父母吃早餐后服用的药片,以防止C从一开始就被发明出来 在上面的前两种情况下,编译器将值为0的int和double的字节解释为以nul结尾的字符数组,并将其视为长度为0的缓冲区,因此不打印任何内容 在第

以下代码中输出的前两行是两个空行,第三行和第四行是两个不相等的大数字,如: 19147336 19147192


我想知道上面代码中reinterpret_cast的返回结果到底是什么。谢谢

您正在进行未定义的行为。编译器可以自由地生成可以做任何事情的代码,包括创建一个机器人,让它回到过去,给K&R的父母吃早餐后服用的药片,以防止C从一开始就被发明出来

在上面的前两种情况下,编译器将值为0的int和double的字节解释为以nul结尾的字符数组,并将其视为长度为0的缓冲区,因此不打印任何内容

在第二组int-cast情况中,它为您提供了从new获取的指针值的较低sizeofint字节的整数表示


这两项都不令人惊讶,但这两项都不可靠。从严格的别名到优化,当您从事未定义的行为时,编译器可能会做一些疯狂的事情,即使您没有连接时间机器或机器人,UB的效果也可能在UB代码运行之前发生。

您正在做未定义的行为。编译器可以自由地生成可以做任何事情的代码,包括创建一个机器人,让它回到过去,给K&R的父母吃早餐后服用的药片,以防止C从一开始就被发明出来

在上面的前两种情况下,编译器将值为0的int和double的字节解释为以nul结尾的字符数组,并将其视为长度为0的缓冲区,因此不打印任何内容

在第二组int-cast情况中,它为您提供了从new获取的指针值的较低sizeofint字节的整数表示

这两项都不令人惊讶,但这两项都不可靠。从严格的别名到优化,当您从事未定义的行为时,编译器可能会做一些疯狂的事情,即使您没有连接时间机器或机器人,UB的效果可能会在运行带有UB的代码之前出现。

代码重新解释\u castpa会生成一个指向类型a的对象的指针。因为a是一个标准布局类,所以它定义得很好,可以通过这种方式访问a的第一个数据成员

std::cout代码reinterpret_castpa生成一个指向类型a的对象的指针。由于a是一个标准布局类,因此定义良好,可以通过这种方式访问a的第一个数据成员


std::不能投票表决。回答得好。特别提到UB可以在UB点之前影响代码这一事实。@barry想象一架无人机飞过它们并打开陷阱门。大型无人机。有足够的药片形成液体。只有您可以防止意外UB。这里有一个链接,他们讨论了由于未定义行为而导致时间旅行的真实代码:这里有一个链接,指向一个未定义行为可以擦除硬盘驱动器的博客:使用IEEE754浮点的ILP32上不会有UB。我听说这被描述为未定义的实现,也就是说,它取决于实现定义的属性,即代码是UB还是NOTUPPATED。回答得好。特别提到UB可以在UB点之前影响代码这一事实。@barry想象一架无人机飞过它们并打开陷阱门。大型无人机。有足够的药片形成液体。只有您可以防止意外UB。这里有一个链接,他们讨论了由于未定义行为而导致时间旅行的真实代码:这里有一个链接,指向一个未定义行为可以擦除硬盘驱动器的博客:使用IEEE754浮点的ILP32上不会有UB。我听说这被描述为实现未定义,也就是说,它取决于实现定义的属性,即代码是UB还是非无关类?无关类?
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;
}