Capire come i contenuti della memoria mappano in una struttura [chiusa]

0

Non sono in grado di capire come i byte in memoria vengano mappati in una struttura. La mia macchina è un little-endian x86_64. Il codice è stato compilato con gcc 4.7.0 dalla distribuzione mingw32-64 Win64 per Win64.

Questi sono i contenuti del frammento di memoria rilevante:

... 450002cf9fe5000040115a9fc0a8fe ...

E questa è la definizione della struct:

typedef struct ip4 {
    unsigned int ihl :4;
    unsigned int version :4;
    uint8_t tos;
    uint16_t tot_len;
    uint16_t id;
    uint16_t frag_off; // flags=3 bits, offset=13 bits
    uint8_t ttl;
    uint8_t protocol;
    uint16_t check;
    uint32_t saddr;
    uint32_t daddr;
    /*The options start here. */
} ip4_t;

Quando un puntatore a una tale struttura (lascia che sia *ip4 ) viene inizializzato sull'indirizzo iniziale della regione di memoria incollata sopra, questo è ciò che il debugger mostra per i campi della struct:

ip4:          address=0x8da36ce
ip4->ihl:     address=0x8da36ce, value=0x5
ip4->version: address=0x8da36ce, value=0x4
ip4->tos:     address=0x8da36d2, value=0x9f
ip4->tot_len: address=0x8da36d4, value=0x0
...

Vedo come sono mappati ihl e versione: 4 byte per un intero lungo, little-endian. Ma non capisco come siano mappati tos e tot_len ; quali byte in memoria corrispondono a ciascuno di essi.

Grazie in anticipo.

    
posta user95592 03.07.2013 - 17:05
fonte

1 risposta

2

tos è mappato a 0x8da36d2, solo 4 byte dopo ihl , e usa il byte a quell'indirizzo per memorizzare il valore 9f . Il compilatore sembra utilizzare l'allineamento a 16 bit qui, quindi l'inizio di tot_len è due byte più tardi da 0x8da36d4 a 0x8da36d5 e il valore a 0x8da36d3 (che sembra essere e5 nel tuo esempio) è solo garbage inutilizzato.

    
risposta data 03.07.2013 - 18:04
fonte

Leggi altre domande sui tag