Hola, les paso un tip. No es un bug, es una de esas peculiaridades que los compiladores de C pueden implementar a placer.
Tengo declarada esta estructura en XC32:
typedef struct Matrix_Data_Tag
{
uint32_t total_frames; /**< How many frames the matrix will draw */
uint8_t total_submatrixes; /**< How many submatrixes the matrix has (must match size below) */
uint32_t submatrix_total_pixels[4]; /**< How many pixels each submatrix has */
uint8_t biggest_submatrix; /**< which submatrix contains the most pixels, first found */
}Matrix_Data_T;En un compilador ideal las direcciones (offset) de los siguientes elementos son:
0 - total_frames
4 - total_submatrixes
5 - submatrix_total_pixels[0]
9 - submatrix_total_pixels[1]
13 - submatrix_total_pixels[2]
17 - submatrix_total_pixels[3]
21 - biggest_submatrix
En XC32 para optimizar el manejo de datos, el compilador está asignando estas direcciones...
Matrix_Data; file:../src/app.c] Matrix_Data_T 0x80008184
total_frames] __uint32_t 0x80008184
total_submatrixes] __uint8_t 0x80008188
submatrix_total_pixels] unsigned int[4] 0x8000818C
submatrix_total_pixels[0]] unsigned int 0x8000818C
submatrix_total_pixels[1]] unsigned int 0x80008190
submatrix_total_pixels[2]] unsigned int 0x80008194
submatrix_total_pixels[3]] unsigned int 0x80008198
biggest_submatrix] __uint8_t 0x8000819C Le conviene más que total_submatrixes pese 4 bytes, pudiendo verlo en su dirección 0x80008188 y viendo que submatrix_total_pixels[0] empieza 4 bytes después.
¿Por qué me afecta este gap o espacio entre elementos? Porque leo los datos desde un arreglo de chars en una SD Card en donde los espacios no existen. Al momento de derreferenciar el arreglo en una estructura los bytes pierden orden.
Para solucionarlo puede copiarse elemento por elemento la estructura desde el arreglo de chars. También se puede usar la palabra clave
packed.
typedef struct Matrix_Data_Tag
{
uint32_t total_frames __attribute__ ((packed)); /**< How many frames the matrix will draw */
uint8_t total_submatrixes; /**< How many submatrixes the matrix has (must match size below) */
uint32_t submatrix_total_pixels[4] __attribute__ ((packed)); /**< How many pixels each submatrix has */
uint8_t biggest_submatrix; /**< which submatrix contains the most pixels, first found */
}Matrix_Data_T;Aparentemente sólo hay que usarla en elementos que no pesan 1 byte. Si se usa en los uint8_t, el compilador avienta un warning.
Haciendo eso, las alineaciones de los elementos ya son conocidas e ideales.

Eso me permite copiar una estructura al vuelo con una derreferenciación.
uint8_t data[SD_CARD_BLOCK_SIZE];
/* The first block always contains the table */
SD_Card_Read(0, data);
/* Copy the data as the expected structure */
Matrix_Data_T Matrix_Data = *((Matrix_Data_T*)data);
Saludos.