4
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);

答えは5131027です。なぜそれが起こっているのかわかりません。概念を理解するのを手伝ってくれる人はいますか。

4

2 に答える 2

5

このようにポインターをキャストすることはお勧めできません。

おそらく、unsigned shortあなたのマシンでは 2 バイトであり、キャスト後、decimal である値 を取得し、 decimalp->aであるの値を取得します。0x0201513p->b0x04031027

エンディアンが異なるマシンでは、結果が異なることに注意してください。たとえば、私のマシンでは、出力は258( 0x0102) と772( 0x0304) です。

また、次のタイプ%uの値を出力するには、フォーマット指定子を使用する必要があることに注意してください。unsigned

printf("%u\t%u\n", p->a, p->b);
于 2013-10-25T04:46:51.857 に答える
3

更新しました

これが起こっているように見えることです...文字の配列は、次のようにメモリに配置されます。

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)

0x020116 進数では 513 に0x0403等しく、1027 に等しくなります。

追加の感想…

コードの動作については何も保証できないことに注意してください。まず、逆参照pは厳密なエイリアシング違反です。厳密なエイリアシング規則とは何ですか?を参照してください。厳密なエイリアシング規則の説明と、このタイプのコードに影響を与えるその他の要因のリストについては、 を参照してください。

于 2013-10-25T04:51:39.600 に答える