C++中的显式地址操作

man*_*pt1 3 c++ pointers

请查看以下func及其输出

void main()
{
    Distance d1;
    d1.setFeet(256);
    d1.setInches(2.2);

    char *p=(char *)&d1;
    *p=1;

    cout<< d1.getFeet()<< " "<< d1.getInches()<< endl;
}
Run Code Online (Sandbox Code Playgroud)

该类Distance获取其值通setFeetsetInches,传递intfloat分别参数.它通过getFeetgetInches方法显示值.

但是,此功能的输出是257 2.2.为什么我会得到这些价值?

Tim*_*ter 14

这是一个非常糟糕的主意:

char *p=(char *)&d1;
*p=1;
Run Code Online (Sandbox Code Playgroud)

您的代码永远不应该对类的内部结构做出假设.例如,如果您的类具有任何虚函数,那么在您调用它们时该代码会导致崩溃.

我只能得出结论,你的Distance班级看起来像这样:

class Distance {
    short feet;
    float inches;
public:
    void setFeet(...
};
Run Code Online (Sandbox Code Playgroud)

当你setFeet(256),它设置高字节(MSB)至1(256 = 1*2 ^ 8)和低字节(LSB)为0.如果值分配1char在所述的地址Distance对象,你迫使所述的第一个字节short表示脚1.在小端机,低字节是在较低的地址,因而结束了一个short与两个字节设置为1,这是1 * 2^8 + 1 = 257.

在big-endian机器上,你仍然会得到值256,但这纯属巧合,因为你碰巧在一个已经为1的字节上强制值为1.

但是,因为你正在使用未定义的行为,取决于编译器和编译选项,你最终可能会得到任何结果.comp.lang.c中一个着名的表达是这种未定义的行为可能"导致恶魔飞出你的鼻子".