2016-11-05 11 views
0

コードは次のようになります。出力を理解できません

#include<stdio.h> 

int main(){ 
    int vals[2]; 
    char *x; 
    int *v, *v2, *v3; 
    vals[0] = 0x00ABCDEF; 
    vals[1] = 0x12345678; 

    x = (char *) &vals[0]; 
    v = (int *) (x + 1); 
    v2 = (int *) (x+2); 
    v3 = (int *) (x+3); 

    printf ("%x \n", *x); /*0x EF */ 
    printf ("%x \n", *v); /*0x 7800ABCD */ 
    printf ("%x \n", *v2); /*0x 567800AB */ 
    printf ("%x \n", *v3); /*0x 34567800 */ 
} 

コメントの値は出力です。 xがEFとv、v2、v3をどのように指しているか説明できますか? その説明は何ですか?私は1桁の16進数が4ビットで、1つのintが8桁の16進数を格納できることを知っていますが、最初の2文字であり、最初の2文字ではなく、お使いのシステムは、アライメント要件、そしてv = (int *) (x + 1);(および次の2行を)持っている場合

+4

https://en.wikipedia.org/wiki/Endianness –

+1

ところでアライメント制限違反。 – BLUEPIXY

+1

[厳密なエイリアシングルールとは何ですか](http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule) – BLUEPIXY

答えて

2

が原因アライメント違反に未定義の動作を引き起こします。

しかし、そうでない場合でも、*v後で原因未定義の動作に厳しいエイリアシング規則に違反することもできます。式*vはタイプintであり、charオブジェクト(または実際にはint,unsigned intまたはそれらのconst修飾バージョン以外のオブジェクト)にアクセスするためにこのタイプの式を使用することはできません。

Undefined behaviourは何がナンセンス出力またはその他を含め、起こる可能性があることを意味します。

関連する問題