Union

Em C, o recurso de union (união) é um pouco parecido com o conceito de struct, embora tenha uma particularidade especial. Apesar das semelhanças com a struct, a union prevê que apenas um valor seja armazenado na estrutura.

O conceito pode parecer um pouco confuso, mas vamos esclarecer ao longo do texto.

👨🏾‍💻 O código

A ideia ainda consiste em criar uma estrutura capaz de reunir diversas variáveis, declarada de forma muito parecida com uma struct, como no exemplo abaixo:

union nomedauniao{
  int variavel1;
  char variavel2;
};

Alternativamente, podemos criar uma união como um tipo de dado:

typedef union{
  int variavel1;
  char variavel2;
} Uniao;

⚖️ Comparando

Como introduzido, enquanto a struct reservará espaço na memória para as duas variáveis, a union reservará apenas o espaço necessário para armazenar uma das duas variáveis.

#include<stdio.h>

typedef union {
  int variavel1;
  char variavel2;
} Uniao;

typedef struct {
  int variavel1;
  char variavel2;
} Estrutura;

int main()
{
  printf("Tamanho: %ld\n", sizeof(Uniao)); // 4 bytes em 32 bits
  printf("Tamanho: %ld\n", sizeof(Estrutura)); // 8 bytes em 32 bits
  return 0;
}

Ilustração da representação de union na memória.

🤷🏼 Serve para quê?

A utilidade da union pode parecer muito pequena. Entretanto, podemos destacar uma grande vantagem: o armazenamento de variáveis excludentes. Por exemplo:

#include<stdio.h>

typedef union {
  int gramas;
  float litros;
} Capacidade;

typedef struct {
  int codigo;
  Capacidade capacidade;
} Produto;

int main()
{
  Produto jarra = { 1, { .litros = 1.5 } };
  Produto vasilha = {1, { .gramas = 450} };
  
  /* Imprimindo corretamente */
  printf("Jarra -> Código: %d | Capacidade: %f", jarra.codigo, jarra.capacidade.litros);
  /* Imprimindo incorretamente */
  printf("Jarra -> Código: %d | Capacidade: %d", jarra.codigo, jarra.capacidade.gramas);
  return 0;
}

📖 Bibliografia

Livros