Estructuras vs. Uniones en C: Guía práctica
¿Qué es una estructura?
Una estructura es un tipo de dato definido por el usuario en C que agrupa elementos de datos lógicamente relacionados de diferentes tipos en una sola unidad. Cada miembro ocupa su propia ubicación de memoria contigua, por lo que una estructura puede contener múltiples valores simultáneamente.
Ejemplo: un registro de estudiante que almacena un nombre, número de matrícula y notas bajo un solo nombre de variable.
¿Qué es una unión?
Una unión también es un tipo definido por el usuario, pero todos los miembros comparten el mismo espacio de memoria. El tamaño de la unión es igual al tamaño de su miembro más grande. Esta característica hace que las uniones sean ideales para escenarios con memoria limitada donde solo se necesita un miembro a la vez.
Declaración de una estructura
struct Estudiante { char nombre[60]; int num_matricula; float notas; };
Observa el uso de la palabra clave struct y el punto y coma después de la llave de cierre.
Ejemplo: Uso de una estructura
#include <stdio.h> struct Estudiante { char nombre[60]; int num_matricula; float notas; } est; int main(void) { printf("Ingrese la siguiente información:\n"); printf("Nombre del estudiante: "); fgets(est.nombre, sizeof(est.nombre), stdin); printf("Número de matrícula: "); scanf("%d", &est.num_matricula); printf("Notas: "); scanf("%f", &est.notas); printf("\nDatos ingresados:\n"); printf("Nombre: %s", est.nombre); printf("Número de matrícula: %d\n", est.num_matricula); printf("Notas: %.1f\n", est.notas); return 0; }
Salida (ejemplo):
Ingrese la siguiente información: Nombre del estudiante: James Número de matrícula: 21 Notas: 67 Datos ingresados: Nombre: James Número de matrícula: 21 Notas: 67.0
Declaración de una unión
union Item { int x; float y; char ch; };
Ejemplo: Uso de una unión
#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 los miembros comparten memoria, establecer ch sobrescribe los valores previos de x y y. Solo el último valor almacenado es válido.
Estructura vs. Unión
| Característica | Estructura | Unión |
|---|---|---|
| Palabra clave de declaración | struct | union |
| Disposición de memoria | Cada miembro obtiene su propio espacio | Todos los miembros comparten un espacio |
| Cambiar un miembro | No afecta a los otros | Sobrescribe a los otros miembros |
| Inicialización | Todos los miembros pueden inicializarse simultáneamente | Solo el primer miembro puede inicializarse a la vez |
| Tamaño total | Suma de tamaños de todos los miembros | Tamaño del miembro más grande |
| Uso típico | Almacenar datos relacionados de varios tipos | Almacenar uno de varios tipos posibles |
| Patrón de acceso | Cualquier miembro puede accederse en cualquier momento | Solo un miembro es válido a la vez |
| Soporte de array flexible | Soportado | No soportado |
Cuándo usar cada uno
- Estructura: Cuando necesitas mantener múltiples campos relacionados simultáneamente, como un registro de estudiante o empleado.
- Unión: Cuando tienes un valor que podría ser de varios tipos pero solo uno a la vez, como un tipo variante o un valor de sensor con memoria limitada.
Ventajas y desventajas
Ventajas de la estructura
- Agrupa datos relacionados bajo un solo nombre, mejorando la legibilidad.
- Fácil de pasar registros completos a funciones.
- Arrays de estructuras permiten almacenar muchos registros.
- Soporta arrays flexibles para datos de longitud variable.
Desventajas de la estructura
- Requiere más memoria, ya que cada miembro se almacena.
- Cambios en la definición de la estructura se propagan por todo el código.
- Puede volverse difícil de manejar en proyectos grandes con estructuras profundamente anidadas.
Ventajas de la unión
- Huella de memoria mínima: solo el tamaño del miembro más grande.
- Útil para implementar etiquetas de tipo o datos variante.
- Puede simplificar código que usa un solo valor de tipo variable.
Desventajas de la unión
- Solo un miembro puede contener un valor válido en un momento dado.
- Más difícil de depurar debido a memoria compartida.
- No puede usar arrays flexibles.
Lenguaje C
- Brazing vs. Soldadura Blanda: Diferencias Clave Explicadas
- Motor 2 Tiempos vs 4 Tiempos: Diferencias Clave Explicadas
- Entendiendo Motores DC vs AC: Diferencias Clave y Guía de Compra
- Amianto vs. fibra de vidrio: Diferencias clave, usos y consideraciones de seguridad
- Struct vs Class en C++: Diferencias Clave, Sintaxis y Mejores Casos de Uso
- C# vs C++: Comparación clara de características, rendimiento y casos de uso
- C vs C++: Diferencias clave y cuándo elegir cada uno
- C vs Java: Comparación exhaustiva de características, historia y aplicaciones
- strlen() vs. sizeof() en C: Entendiendo sus diferencias y uso correcto
- Python vs JavaScript: Diferencias Clave, Características y Cuándo Elegir Cada Uno
- Python vs Ruby: Comparativa Exhaustiva de Características, Ventajas y Casos de Uso