2016-11-05 3 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 может хранить 8 шестнадцатеричных цифр, но не может понять, как x указывает на EF, а не 00, которые являются первыми двумя буквами и почему последние две буквы, а не первые два.

+4

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

+1

BTW Нарушение ограничения выравнивания. – BLUEPIXY

+1

[Что такое строгое правило псевдонимов?] (Http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule) – BLUEPIXY

ответ

2

Если ваша система имеет требования к выравниванию, то v = (int *) (x + 1); (и следующие две строки) вызывают неопределенное поведение из-за нарушения выравнивания.

Но даже если они этого не делают, *v позже вызывает неопределенное поведение, нарушая правило строгого сглаживания. Выражение *v имеет тип int, и ему не разрешено использовать этот тип выражения для доступа к объектам char (или фактически любые объекты, отличные от int, unsigned int или конструктивные версии этих версий).

Undefined behaviour означает, что все может произойти, в том числе бессмысленный выход или иным образом.

Смежные вопросы