Per le strutture, come per qualsiasi tipo di dato in c, hai bisogno di allocare memoria solo quando fai allocazione dinamica, ergo usi i puntatori. Nel caso dichiari una variabile statica, di tipo struttura, l'allocazione di memoria viene fatta automaticamente.
Ti riporto un banale esempio che illustra la definizione di una struttura e la dichiarazione di una variabile di tipo struttura e di un puntatore alla struttura, che vanno gestiti in maniera differente
Codice:
int main()
{
typedef struct
{
int a;
int b;
} my_struct;
my_struct x; // variabile di tipo my_struct
my_struct* y; // puntatore a my_struct
x.a=8; //corretta (non ho allocato nulla)
y=(my_struct*)malloc(sizeof(my_struct)); //se ometti questa allocazione, l'istruzione seguente va in errore
y->a=9;
}