Размер массива char внутри объединения не печатается правильно

union u
{
    int a;
    float b;
    char c[10];
};
int main()
{
    union u abc;
    printf("\n%d",sizeof(abc));
}

Вывод: 12 Я ожидаю, что выход будет 10.sizeof(char) равен 1. Так что для 10 я ожидаю, что это будет 10. Может кто-нибудь объяснить мне, почему мы получаем 12.

1 ответ

Это потому, что, вероятно, по крайней мере один между float или же int Тип данных имеет требование выравнивания 4 байта. Итак struct получает 2 байта заполнения (так что sizeof(struct u) % 4 == 0).

Ты можешь использовать __attribute__((packed)) или аналогичные функции, если ваш компилятор поддерживает их, чтобы избежать заполнения, но это не удобно, если у вас нет уже существующих данных для соответствия. Подумайте о том, что массив упакован struct u элементы будут выровнены float/int члены.

Другие вопросы по тегам