La struttura dati union in C

Le union in C sono dei particolari tipi di dato che permettono di memorizzare diversi tipi di dato, con anche dimensioni diverse, nella stessa zona di memoria. In particolare si può definire una union contenente numerose variabili di tipi di dato diverso, ma solamente una di quelle variabili potrà contenere un valore. Infatti il compilatore alloca lo spazio di memoria necessario per poter gestire la più grande variabile dichiarata. In questo modo, dato che si può utilizzare solamente una variabile per volta, lo spazio allocato sarà sempre a sufficienza per qualsiasi delle variabili già dichiarate.
Questa caratteristica fondamentale delle union, permette di utilizzare in maniera efficiente lo stesso spazio di memoria per gestire diverse variabili.

Le union sono definite in maniera analoga alle struct (o strutture), infatti anch'esse richiedono l’utilizzo di una specifica keyword e la definizione dei campi. Di seguito viene riportata la sintassi delle union in C:



union nome_union{
	tipoDato_1;
	tipoDato_2;
	…
}(una o più variabili di tipo union);

dove union è la keyword necessaria per poter definire una union, nome_union è un campo opzionale che indica il nome della union. All’interno della union si possono dichiarare variabili con dimensione e di tipo diverso, attraverso una normale dichiarazione di variabile. Infine, prima dell’ultimo punto e virgola è possibile (campo opzionale) dichiarare diverse variabili di quel tipo di union. Ad esempio consideriamo la seguente definizione di union:



union Mezzo{
	char marca[50];
	int costo;
};

In questo modo abbiamo definito una union denominata "Mezzo" che potrà contenere un array di caratteri oppure un intero nella stessa posizione all’interno della memoria. A questo punto possiamo dichiarare una union di tipo Mezzo usando la seguente sintassi:



union Mezzo m1, m2;


oppure possiamo dichiarle anche all’interno della definizione di union, inserendo il nome delle due variabili prima del punto e virgola:



union Mezzo{
	char marca[50];
	int costo;
} m1, m2;

Accedere ai campi delle union in C

L’accesso ai campi di una union in C avviene allo stesso modo di come avviene l’accesso ai campi delle strutture. Nello specifico si fa uso del nome della variabile dichiarata e del campo da accedere, uniti da un punto '.' come nel seguente modo:m1.costoed a questo punto si possono effettuare le solite operazioni sulle variabili, come l’assegnazione di un valore:m1.costo = 1000;

Chiaramente trattandosi di una union, assegnato un valore ad un suo campo, gli altri campi della union non avranno alcun valore. Per esempio, consideriamo il seguente codice:



#include <stdio.h>
#include <string.h>

union Mezzo{
	char marca[50];
	int costo;
} m1, m2;

int main(){
    m1.costo = 1000;
    strcpy(m1.marca, "FIAT");
    
    printf("marca: %s\n", m1.marca);
    printf("costo: %d\n", m1.costo);

    return 0;
}


marca: FIAT costo: 1413564742

Osservando il risultato ottenuto, possiamo notare che il campo marca della union m1 contiene il valore assegnato, mentre il suo campo costo contiene un valore completamente diverso. Questo è dovuto al fatto che l’ultima assegnazione ai campi di m1 è stata fatta alla variabile marca, di conseguenza nello spazio di memoria sarà posto il suo valore.

Indice pagine linguaggio C: