Le matrici devono lasciare abbastanza spazio tra ciascun indirizzo di offset per adattarsi a ciò che stanno memorizzando. Dato che hai una matrice di 4 byte int
s, c'è una differenza di quattro byte tra l'indirizzo di ciascun elemento.
Diamo un'occhiata a ciò che un array di 4 byte int
s assomiglia alla memoria (su un grandezza di byte -endiano sistema). Userò dei numeri diversi per i valori, quindi possiamo facilmente rintracciare quali byte appartengono a quali numeri interi. Ecco l'array che sto utilizzando:
int* array = new int[4]
array[0] = 0x1A1B1C1D
array[1] = 0x2A2B2C2D
array[2] = 0x3A3B3C3D
array[3] = 0x4A4B4C4D
Ed ecco come appare in memoria:
Address Byte Offset Int
...
009694B0 (1A) -- 0 \
009694B1 (1B) | \ 0x1A1B1C1D
009694B2 (1C) | /
009694B3 (1D) / /
009694B4 (2A) -- 1 \
009694B5 (2B) | \ 0x2A2B2C2D
009694B6 (2C) | /
009694B7 (2D) / /
009694B8 (3A) -- 2 \
009694B9 (3B) | \ 0x3A3B3C3D
009694BA (3C) | /
009694BB (3D) / /
009694BC (4A) -- 3 \
009694BD (4B) | \ 0x4A4B4C4D
009694BE (4C) | /
009694BF (4D) / /
...
Ed ecco come apparirebbe se ogni valore fosse memorizzato nel byte successivo, invece del quarto byte:
Address Byte Offset Int
...
009694B0 (1A) -- 0 0x1A2A3A4A
009694B1 (2A) -- 1 0x2A3A4A4B
009694B2 (3A) -- 2 0x3A4A4B4C
009694B3 (4A) -- 3 0x4A4B4C4D
009694B4 (4B) |
009694B5 (4C) |
009694B6 (4D) /
...
Questo non è esattamente ciò che abbiamo inserito. Solo l'ultimo numero che abbiamo assegnato, 0x4A4B4C4D
è uscito indenne. Il resto è stato parzialmente sovrascritto dai numeri successivi.