Переинтерпретация 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).