Wyrażenie ustawi dwa bajty 18 bajtów po rozpoczęciu arr
do wartości 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]);
}
}
Możliwa wyjściowa:
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)
We wszystkich profesorów shenanigans on przeniósł cię 1 całkowitą , 8 znaków/bajtów i 3 szorty, które 4 + 8 + 6 = 18 bajtów. Bingo.
Zauważ, że to wyjście ujawnia komputer, na którym to uruchomiłem, aby mieć 4-bajtowe liczby całkowite, 2 bajty krótkie (często) i być małe-endianowe, ponieważ ostatnie dwa bajty tablicy zostały ustawione odpowiednio na 0x64 i 0x00.
Uważam, że diagramy są strasznie zagmatwane, ponieważ nie jest jasne, czy masz na myśli "|" adresować, czy nie.
|....|....|....|....|
^ 1^ ^2
A X C S B
Dołącz barów ('|') A jest początkiem Arr
i B jest 'jeden za końcem' (pojęciem prawnym w C).
X jest adresem, o którym mowa w wyrażeniu & Arr [1]. C za pomocą wyrażenia (((znak *) (& arr [1])) + 8). S przez całe wyrażenie. S i bajt po są przypisane, a to zależy od stopnia zaawansowania platformy.
Zostawiam to jako ćwiczenie, aby określić, jaki wynik na podobnej, ale wielkiej endianowej platformie, która generuje. Ktoś? Zauważyłem z komentarzy, że jesteś big-endianinem i jestem little-endian (przestań się śmiać). Należy zmienić tylko jedną linię danych wyjściowych.
Masz rację.Napisz kod, aby wydrukować wartości wskaźników, aby pokazać profesorowi, że masz rację. –
Wszystko zależy od 'sizeof (int)', które niekoniecznie musi być '4'. –
@BlagovestBuyukliev Mój profesor stwierdził, że przyjmuje się, że 'sizeof (int)' to 4 na czas trwania klasy. Przepraszam, powinienem był o tym wspomnieć. – Alexey