无法理解输出

时间:2016-11-05 06:41:46

标签: c pointers

代码看起来像这样。

#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可以存储8个十六进制数字但是​​不能理解x如何指向EF而不是00指的是前两个字母以及为什么最后两个字母而不是前两个字母。 / p>

1 个答案:

答案 0 :(得分:2)

如果您的系统具有对齐要求,则v = (int *) (x + 1);(以及接下来的两行)会因对齐违规而导致未定义的行为。

但即使他们不这样做,*v稍后会因违反严格别名规则而导致未定义的行为。表达式*v具有类型int,并且不允许使用此类型的表达式来访问char个对象(或实际上除int以外的任何对象,{{ 1}}或const限定版本的那些)。

Undefined behaviour表示可能发生任何事情,包括废话输出或其他。