Я знаю, что разные типы данных будут выравниваться. Но я не могу понять, почему размер этой структуры равен 12.
#include <stdio.h>
struct ABC{
char a;
char b;
int k;
char c;
};
int main()
{
struct ABC a;
printf("%lu\n", sizeof(a)); //12
return 0;
}
Различные компиляторы будут давать разные результаты, поэтому, не зная, какой компилятор вы используете, сложно ответить. Просто угадал, похоже, что он фиксирует 32-битное значение для первых 2 символов, другое 32-битное значение для int и третье 32-битное значение для последнего char. Вы можете немного поэкспериментировать, создав массив этой структуры и напечатав размер массива.
Хорошо, это работает так
Вот правила:
char
выровнены по 1 байту
int
s выровнены по 4 байтам
Вся структура должна быть выровнена по кратному наибольшему элементу.
окончательная структура будет
struct ABC
{
char a; // Byte 0
char b; // Byte 1
char padding0[2]; // to align the int to 4 bytes
int k; // Byte 4
char c; // Byte 5
char padding1[3]; // align the structure to the multiple of largest element.
// largest element is int with 4 bytes, the closest multiple is 12, so pad 3 bytes more.
}
Посмотрите в смещение().