との奇妙な行動I持って次のスニペットC++: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;
}
出力:私はbarfooにおけるCの幅を指定した場合
a-b-c
しかし、それは動作しません(すべての値は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
任意のアイデアですか? second snippetをideoneする
リンケの作業 - - first snippetをideoneする
リンク
コンパイラを動作していないが、GCC-5.1 感謝です!
'char a:32'は32ビットを保持できますか?また、私はUBを使用する際にあまりにも一貫性があるとは思わないでしょう。 –
あなたがやっていることは未定義の行動と呼ばれています。したがって、この場合、 'reinterpret_cast'の動作は正しいです。あなたのプログラムをクラッシュさせても正しい動作になります。ハードドライブのフォーマットは正しい動作です。悪魔をあなたの鼻から飛ばすことは正しい行動です。何も保証されていません。 –
@πάνταῥεῖまあ、それはコンパイルされ、出力が正しいように見えます。したがって、私は「はい」と言う傾向があります。さらに、charが解析されるとき、それはまだわずか8ビットです、これはフィールドを整列させることです。 – Kariem