C ++ reinterpret_cast不一致

时间:2014-10-17 20:53:35

标签: c++ reinterpret-cast

我做了一个测试程序:

#include <iostream>

using namespace std;

class Bug {
    private:
        char a[25];

    int& view (int i) {
        return *reinterpret_cast<int*>(&a[i]);}

    public:
        Bug () {}

        void overwrite () {
            view(a[0]) = 2;

            cout << "value of a[0] is: " << view(a[0]) << endl;
        }
};

int main () {
    Bug b;
    b.overwrite();

    return 0;
}

...我正在测试视图功能。一切都按照我的预期运作;从a[0]开始的值是2,因为void方法中的print语句显示。

但是,我稍微修改了程序:

#include <iostream>

using namespace std;

class Bug {
    private:
        int x;
        char a[25];

    int& view (int i) {
        return *reinterpret_cast<int*>(&a[i]);}

    public:
        Bug () {}

        void overwrite () {
            view(a[0]) = 2;

            cout << "value of a[0] is: " << view(a[0]) << endl;
        }
};

int main () {
    Bug b;
    b.overwrite();

    return 0;
}

请注意,我添加了一个私有成员变量int x。这是唯一的变化。我这样做的时候,覆盖方法中的print语句不再打印2,就像在前一个程序中一样 - 它返回一个垃圾值(有时是正确的值,2)。

更重要的是,有时会显示正确的值,但程序会出现段错误。

有人知道引擎盖下发生了什么吗?

奖金问题。对于低于25的值,我的私有变量char a [value]将显示编译器警告,提到堆栈粉碎(使用g ++ - 4.7)。

0 个答案:

没有答案