2016-11-05 73 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。 这是什么解释。我知道一个十六进制数字是四位,一个int可以存储八位十六进制数字,但无法理解x如何指向EF,而不是00,这是前两个字母,为什么是最后两个字母而不是前两个。

+4

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

+1

顺便说一下排列限制违规。 – BLUEPIXY

+1

[什么是严格的别名规则?](http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule) – BLUEPIXY

回答

2

如果您的系统具有对齐要求,那么v = (int *) (x + 1);(和接下来的两行)会导致未定义的行为,这是由于对齐违反。

但即使他们不这样做,*v稍后将通过违反严格的别名规则导致未定义的行为。表达式*v的类型为int,且不允许使用此类表达式来访问对象(或实际上除int,unsigned int或这些对象的常量限定版本以外的任何对象)。

Undefined behaviour意味着什么都可能发生,包括无意义的输出或其他。