Sono un po 'confuso su come i byte sono ordinati in un struct
.Ordine byte nella struttura
Diciamo che ho il seguente struct:
struct container {
int myint;
short myshort;
long mylong;
};
ora, voglio inizializzare una variabile di tipo struct container
proprio come il seguente, se non che io voglio farlo utilizzando un array.
struct container container1 = {.myint = 0x12345678,
.myshort = 0xABCD,
.mylong = 0x12345678};
Assumere sizeof
int
e long
sono 4
, e quello di short
è 2
.
Assumere che non ci sia il riempimento.
Come sarebbe il layout di 10 bytes
di struct
?
Dipende dalla endianità?
sarebbe che si tratti del tipo:
0x12345678 ABCD 12345678
o simile:
0x78563412 CDAB 78563412
Quello che voglio fare è: Ho il seguente array di caratteri:
char buffer[10] = {0};
voglio per riempire manualmente questo array con i dati e quindi memcpy
per struct
.
dovrei fare [1]:
buffer[0] = 0x12345678 & 0xFF;
buffer[1] = 0x12345678 >> 8 & 0xFF;
buffer[2] = 0x12345678 >> 16 & 0xFF;
buffer[3] = 0x12345678 >> 24 & 0xFF;
...
buffer[9] = 0x12345678 >> 24 & 0xFF;
o dovrebbe essere [2]:
buffer[0] = 0x12345678 >> 24 & 0xFF;
buffer[1] = 0x12345678 >> 16 & 0xFF;
buffer[2] = 0x12345678 >> 8 & 0xFF;
buffer[3] = 0x12345678 & 0xFF;
...
buffer[9] = 0x12345678 & 0xFF;
prima che io faccio il mio memcpy
come:
memcpy(&container1, buffer, sizeof(container1);
E, se io sono wr è un array e copia a struct
, è portatile su tutti i sistemi, specialmente per quanto riguarda l'endianness?
EDIT: Does [1] lavoro su una macchina endian poco e [2] su un big endian?
No, non è portabile. Sì, dipende da endianness. E le ipotesi sul riempimento e sulla dimensione dei tipi porteranno anche a problemi di portabilità. – user3386109
Per enfatizzare * nessun modo portabile *, ciò significa che nessun modo portabile dal compilatore al compilatore sullo stesso sistema operativo, molto meno portabile dal sistema operativo al sistema operativo. –
Ovviamente dipende da endianness! Dopo la tua ipotesi "non c'è padding" la domanda non ha più nulla a che fare con i tipi di struct. Si tratta semplicemente di rappresentare numeri interi in memoria. – AnT