Переинтерпретация C++ противоречива

Я сделал тестовую программу:

#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, как показывает оператор print в методе void.

Однако я немного модифицирую программу:

#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 в методе overwrite больше не печатает 2, как в предыдущей программе - он возвращает значение мусора (а иногда и правильное значение, 2).

Что еще более важно, иногда будет отображаться правильное значение, но программа будет зависать.

Кто-нибудь знает, что происходит под капотом?

Бонусный вопрос. для значений ниже 25 моя личная переменная char a[value] будет отображать предупреждения компилятора, в которых упоминается разрушение стека (с использованием g++-4.7).

0 ответов

Другие вопросы по тегам