struct check{
unsigned short a;
unsigned short b;
};
static unsigned char v[5] = {1,2,3,4,5};
struct check *p = (struct check *)v;
printf("%d",p->a);
printf("\t%d",p->b);
答えは513
と1027
です。なぜそれが起こっているのかわかりません。概念を理解するのを手伝ってくれる人はいますか。
このようにポインターをキャストすることはお勧めできません。
おそらく、unsigned short
あなたのマシンでは 2 バイトであり、キャスト後、decimal である値 を取得し、 decimalp->a
であるの値を取得します。0x0201
513
p->b
0x0403
1027
エンディアンが異なるマシンでは、結果が異なることに注意してください。たとえば、私のマシンでは、出力は258
( 0x0102
) と772
( 0x0304
) です。
また、次のタイプ%u
の値を出力するには、フォーマット指定子を使用する必要があることに注意してください。unsigned
printf("%u\t%u\n", p->a, p->b);
更新しました
これが起こっているように見えることです...文字の配列は、次のようにメモリに配置されます。
v+0: 0x01
v+1: 0x02
v+2: 0x03
v+3: 0x04
v+4: 0x05
v
型にキャストしstruct check *
て逆参照すると、このメモリ領域は次のように再解釈されます。
p->a: 0x0201 (v+1, v+0)
p->b: 0x0403 (v+3, v+2)
0x0201
16 進数では 513 に0x0403
等しく、1027 に等しくなります。
追加の感想…
コードの動作については何も保証できないことに注意してください。まず、逆参照p
は厳密なエイリアシング違反です。厳密なエイリアシング規則とは何ですか?を参照してください。厳密なエイリアシング規則の説明と、このタイプのコードに影響を与えるその他の要因のリストについては、 を参照してください。