Это проблема выравнивания. Минимальный размер выравнивания структуры составляет 4 байта, и он будет варьироваться в зависимости от объявления типа данных в структуре (например, double). Вот если вы напечатаете размер одного блока, он напечатает 3 вместо 4. Но если вы напечатаете размер ваша структура, он напечатает 4 из-за минимального размера выравнивания.
Предположим, что если у вас также есть элемент int в структуре, то и размер отдельного блока, и структура будут равны 8. Это из-за того, что компилятор принудительно распределил байт заполнения между символами и типом int. Например
typedef struct {
signed char r;
signed char g;
signed char b;
}MyType;
MyType *type = (MyType *)calloc(20, sizeof(MyType));
printf("size: %ld", sizeof(MyType));
printf("size: %ld", sizeof(type[0]));
Первый оператор printf напечатает 4, а второй напечатает 3. Поскольку размер выравнивания структуры по умолчанию составляет 4 байта, а фактическое распределение составляет 3 байта. Теперь просто добавьте один тип int к той же структуре.
typedef struct {
signed char r;
signed char g;
signed char b;
int i; // New int element added here
}MyType;
MyType *type = (MyType *)calloc(20, sizeof(MyType));
printf("size: %ld", sizeof(MyType));
printf("size: %ld", sizeof(type[0]));
Здесь оба оператора printf будут печатать 8. Потому что компилятор вынужден размещать байт между char и int, чтобы просто сохранить выравнивание кратным четырем. Тогда структура будет выглядеть так, как указано ниже,
typedef struct {
signed char r;
signed char g;
signed char b;
char padding; // Padding byte allocated to keep alignment.
int i;
}MyType;
Таким образом, вы должны добавить в свою структуру байт заполнения, чтобы сохранить выравнивание, поскольку фактическое распределение составляет 3 байта.
Размер размещения структуры также будет варьироваться в зависимости от положения различных объявлений типов данных внутри структуры.