Выражение установит два байта через 18 байтов после начала arr
в значение 100.
#include <stdio.h>
int main() {
int arr[5];
char* start=(char*)&arr;
char* end=(char*)&((short*)(((char*) (&arr[1])) + 8))[3];
printf("sizeof(int)=%zu\n",sizeof(int));
printf("sizeof(short)=%zu\n",sizeof(short));
printf("offset=%td <- THIS IS THE ANSWER\n",(end-start));
printf("100=%04x (hex)\n",100);
for(size_t i=0;i<5;++i){
printf("arr[%zu]=%d (%08x hex)\n",i,arr[i],arr[i]);
}
}
Возможный выход:
sizeof(int)=4
sizeof(short)=2
offset=18 <- THIS IS THE ANSWER
100=0064 (hex)
arr[0]=0 (00000000 hex)
arr[1]=0 (00000000 hex)
arr[2]=0 (00000000 hex)
arr[3]=0 (00000000 hex)
arr[4]=6553600 (00640000 hex)
Во всех ваших махинациях профессора он сдвигал вам 1 целое число, 8 символов / байтов и 3 коротких строки, что 4 + 8 + 6 = 18 байтов. Бинго.
Обратите внимание, что этот вывод показывает, что машина, на которой я запускал это, имеет 4-байтовые целые числа, 2-байтовые короткие (обычные) и с прямым порядком байтов, потому что последние два байта массива были установлены на 0x64 и 0x00 соответственно.
Я нахожу ваши диаграммы ужасно запутанными, потому что они не очень понятны, если вы имеете в виду '|' быть адресами или нет.
|....|....|....|....|
012345678901234567890
^ 1 ^ ^ 2
A X C S B
Включите полоски ('|') A - начало Arr
, а B - «один за концом» (юридическая концепция в C).
X - это адрес, на который указывает выражение & Arr [1]. C выражением (((char *) (& arr [1])) + 8). S всем выражением. S и следующий за ним байт назначаются, и то, что это означает, зависит от порядка байтов вашей платформы.
Я оставляю это как упражнение, чтобы определить, что выводит на аналогичной, но с прямым порядком байтов, кто выводит. Кто-нибудь? Я заметил из комментариев, что вы с прямым порядком байтов, а я с прямым порядком байтов (хватит хихикать). Вам нужно изменить только одну строку вывода.
person
Persixty
schedule
17.02.2015
sizeof(int)
, что не обязательно4
. - person Blagovest Buyukliev   schedule 17.02.2015sizeof(int)
равно 4 на протяжении всего урока. Извините, я должен был упомянуть об этом. - person Alexey   schedule 17.02.2015short*
. Его заявление о прямом порядке байтов проясняет самые реалистичные вопросы о семантике, но это все еще неопределенное поведение. - person Persixty   schedule 17.02.2015