Это одна из причин, по которой чтение целых структур, а не элементов по элементам не удается, и их следует избегать.
В этом случае упаковка плюс выравнивание в 4 означает, что будет два байта заполнения. Это происходит потому, что размер должен быть совместимым для хранения типа в массиве со всеми элементами, все еще выровненными в 4.
Я полагаю, у вас есть что-то вроде:
read(fd, &obj, sizeof obj)
Поскольку вы не хотите читать те 2 байта заполнения, которые принадлежат разным данным, вы должны явно указать размер:
read(fd, &obj, 42)
Который вы можете поддерживать:
typedef struct {
//...
enum { read_size = 42 };
} __attribute__((aligned(4),packed)) CHALLENGE;
// ...
read(fd, &obj, obj.read_size)
Или, если вы не можете использовать некоторые функции C ++ в вашем C:
typedef struct {
//...
} __attribute__((aligned(4),packed)) CHALLENGE;
enum { CHALLENGE_read_size = 42 };
// ...
read(fd, &obj, CHALLENGE_read_size)
При следующей возможности рефакторинга я настоятельно рекомендую вам начать читать каждый элемент по отдельности, который может быть легко заключен в функцию.