У меня есть следующий фрагментС ++: странное поведение с reinterpret_cast
#include <iostream>
using namespace std;
class foobar
{
public:
unsigned int a = 97;
unsigned int b = 98;
unsigned int c = 99;
};
class barfoo
{
public:
char a:32,b:32,c;
};
int main(){
foobar * f = new foobar();
barfoo * b = (reinterpret_cast<barfoo *>(f));
cout << b->a << "-" << b->b << "-" << b->c;
}
Выход:
a-b-c
Однако, если указать ширину с в barfoo, он не работает (все значения равны 0). Наблюдайте
#include <iostream>
using namespace std;
class foobar
{
public:
unsigned int a = 97;
unsigned int b = 98;
unsigned int c = 99;
};
class barfoo
{
public:
char a:32,b:32,c:32;
};
int main(){
foobar * f = new foobar();
barfoo * b = (reinterpret_cast<barfoo *>(f));
cout << b->a << "-" << b->b << "-" << b->c;
}
Выход:
--
В символы все 0
Любая идея, почему это происходит?
Ссылки на ideone first snippet - работа
Линка к ideone second snippet - не работает
Компилятор GCC-5.1 Спасибо !!
Вы уверены, что 'char a: 32' может содержать 32 бита? Также я бы не ожидал слишком много согласованности при использовании UB. –
Что вы делаете, называется Undefined Behavior. Поэтому поведение 'reinterpret_cast' является правильным в этом случае. Это сбой вашей программы также будет правильным поведением. Форматирование жесткого диска - правильное поведение. Правильное поведение демонов вылетает из вашего носа. Ничего не гарантировано. –
@ πάνταῥεῖ Ну, он скомпилирован, и вывод выглядит правильно. Поэтому я склонен сказать «да». Кроме того, когда синтаксический анализ обрабатывается, он все еще остается только 8 бит, это всего лишь выравнивание полей. – Kariem