Structs vs. Unions em C: Guia Prático
O que é uma Struct?
Uma struct (estrutura) é um tipo de dado definido pelo usuário em C que agrupa itens de dados logicamente relacionados de diferentes tipos em uma única unidade. Cada membro ocupa sua própria localização de memória contígua, então uma struct pode conter múltiplos valores simultaneamente.
Exemplo: um registro de aluno que armazena nome, número de matrícula e notas sob um único nome de variável.
O que é uma Union?
Uma union (união) também é um tipo definido pelo usuário, mas todos os membros compartilham o mesmo espaço de memória. O tamanho da union é igual ao tamanho de seu maior membro. Este recurso torna unions ideais para cenários com restrição de memória onde apenas um membro é necessário por vez.
Declarando uma Struct
struct Student {
char name[60];
int roll_no;
float marks;
};
Observe o uso da palavra-chave struct e o ponto e vírgula após a chave de fechamento.
Exemplo: Usando uma Struct
#include <stdio.h>
struct Student {
char name[60];
int roll_no;
float marks;
} sdt;
int main(void) {
printf("Digite as seguintes informações:\n");
printf("Nome do aluno: ");
fgets(sdt.name, sizeof(sdt.name), stdin);
printf("Número de matrícula: ");
scanf("%d", &sdt.roll_no);
printf("Notas: ");
scanf("%f", &sdt.marks);
printf("\nDados inseridos:\n");
printf("Nome: %s", sdt.name);
printf("Número de matrícula: %d\n", sdt.roll_no);
printf("Notas: %.1f\n", sdt.marks);
return 0;
}
Saída (exemplo):
Digite as seguintes informações: Nome do aluno: James Número de matrícula: 21 Notas: 67 Dados inseridos: Nome: James Número de matrícula: 21 Notas: 67.0
Declarando uma Union
union Item {
int x;
float y;
char ch;
};
Exemplo: Usando uma Union
#include <stdio.h>
union Item {
int x;
float y;
char ch;
};
int main(void) {
union Item it;
it.x = 12;
it.y = 20.2f;
it.ch = 'a';
printf("x = %d\n", it.x);
printf("y = %f\n", it.y);
printf("ch = %c\n", it.ch);
return 0;
}
Como todos os membros compartilham memória, definir ch sobrescreve os valores anteriores de x e y. Apenas o último valor armazenado é válido.
Struct vs. Union
| Característica | Struct | Union |
|---|---|---|
| Palavra-chave de declaração | struct | union |
| Layout de memória | Cada membro tem seu próprio espaço | Todos os membros compartilham um espaço |
| Alterar um membro | Não afeta outros | Sobrescreve outros membros |
| Inicialização | Todos os membros podem ser inicializados simultaneamente | Apenas o primeiro membro pode ser inicializado por vez |
| Tamanho total | Soma dos tamanhos de todos os membros | Tamanho do maior membro |
| Uso típico | Armazenar dados relacionados de vários tipos | Armazenar um de vários tipos possíveis |
| Padrão de acesso | Qualquer membro pode ser acessado a qualquer momento | Apenas um membro é válido por vez |
| Suporte a array flexível | Suportado | Não suportado |
Quando Usar Cada Um
- Struct: Quando você precisa manter múltiplos campos relacionados simultaneamente, como um registro de aluno ou funcionário.
- Union: Quando você tem um valor que pode ser de vários tipos mas apenas um por vez, como um tipo variante ou valor de sensor com restrição de memória.
Prós e Contras
Vantagens da Struct
- Agrupa dados relacionados sob um único nome, melhorando legibilidade.
- Fácil de passar registros inteiros para funções.
- Arrays de structs permitem armazenar muitos registros.
- Suporta arrays flexíveis para dados de comprimento variável.
Desvantagens da Struct
- Requer mais memória, pois todo membro é armazenado.
- Mudanças na definição da struct propagam por todo o código.
- Podem se tornar difíceis em grandes projetos com structs profundamente aninhadas.
Vantagens da Union
- Pegada de memória mínima: apenas o tamanho do maior membro.
- Útil para implementar tags de tipo ou dados variantes.
- Pode simplificar código que usa um único valor de tipo variável.
Desvantagens da Union
- Apenas um membro pode conter um valor válido por vez.
- Mais difícil de depurar devido à memória compartilhada.
- Não pode usar arrays flexíveis.
Linguagem C
- Amianto vs. Fibra de Vidro: Diferenças-Chave, Usos e Considerações de Segurança
- C++ Struct vs Class: Diferenças Principais, Sintaxe e Melhores Casos de Uso
- C# vs C++: Comparação Clara de Recursos, Desempenho e Casos de Uso
- C vs. C++: Principais Diferenças e Quando Escolher Cada Um
- C vs Java: Comparação Abrangente de Recursos, História e Aplicações
- strlen() vs. sizeof() em C: Entendendo Diferenças e Uso Correto
- Python vs JavaScript: Principais Diferenças, Recursos e Quando Escolher Cada Um
- Entendendo Motores CC vs CA: Diferenças Principais e Guia de Compra
- Brasagem vs Solda Branda: Principais Diferenças Explicadas
- Motores 2 Tempos vs 4 Tempos: Diferenças Principais Explicadas