Как работает union? [дубликат]

133
18 августа 2019, 03:30

На данный вопрос уже ответили:

  • Зачем нужно объединение (union)? 4 ответа
  • Где хранятся куски union? C (Си) 4 ответа
union Foo
{
int a;
float b;
long double c;
char d;
};

Как union может интерпретировать пам'ять для разных типов?

Answer 1

Ну, объединения в С и С++ работают очень просто. Ты указываешь, что вот в этой области памяти у тебя будет несколько полей (в примере 4 штуки), но тип каждого из них разный.

Когда ты обращаешься к каждому из этих полей, компилятор создает соответствующие обращения к одной и той же области памяти (по одному адресу), но с разными размерами.

Твой пример немного синтетический, как его использовать в реальности - не могу придумать. Но вот тебе вполне рабочий пример:

typedef struct {
    union {
        unsigned int address;
        unsigned char bytes[4];
    }
} ipv4_address;

В итоге ты можешь обратиться либо к целому адресу как к 32-битному числу (например чтобы его скопировать), а можешь обратиться к каждому байту из 4 штук, чтобы например вывести адрес в нотации X.X.X.X чем-то вроде printf("%d.%d.%d.%d",ipv4.bytes[0],ipv4.bytes[1],ipv4.bytes[2],ipv4.bytes[3]).

То есть Union позволяет смотреть на одну и ту же область памяти через разные "призмы", вернее через разные типы данных.

В принципе ты можешь наложить int и float. Но хорошее из этого вряд ли что получится, поскольку битовое кодирование целых чисел и чисел с плавающей точкой разное, и придумать задачу, где это может пригодиться, у меня не получается )

Кстати, ты можешь не использовать Union вообще, а пойти опасным путем - приводи адрес переменной одного типа к адресу переменной другого типа.

unsigned int a = 44;
unsigned char *c = (unsigned char *)(&a);
printf("%d", c[3]); // Выводим последний, то есть 4-ый, октет переменной a

Жуть, правда? Никогда так не делай, уж лучше Union. И вообще, это довольно грязные трюки со множеством допущений и подводных камней, в обычной работе лучше сделать то же самое, но надежнее и проще.

READ ALSO
Зачем нужен флаг /EHsc для MSVC компилятора?

Зачем нужен флаг /EHsc для MSVC компилятора?

Зачем нужен флаг /EHsc для MSVC компилятора? Недавно увидел его в конфиге, почитал доки, но так и не понял о каких синхронных/асинхронных исключениях...

106
Объявление структуры С++ с typedef

Объявление структуры С++ с typedef

Постоянно вижу в различных учебниках такой синтаксис объявления структур

119
Проблема при перегрузке оператора “-”

Проблема при перегрузке оператора “-”

Не пойму как правильно перегрузить оператор "-" для класса массиваОписание класса:

138