Je ne comprends pas ce que tu veux dire par "tout en tirant parti de l'allocation dynamique du C".
Définir une structure est indépendant de l'allocation dynamique ou statique, un structure n'est rien d'autre qu'un "super type" de variable.
Un exemple simple de structure pour un couple (x, y) réels :
typedef struct sCouple
{
float x; //abscisse
float y; //ordonnée
} couple;
après dans ta main (ou n'importe quelle autre fonction) tu utilise couple comme un type de variable, mais il faut penser à faire une petite fonction pour l'initialisation dans le cas où tu le ferais dynamique.
couple* creerCouple(float x, float y)
{
couple *c = (couple*) malloc(sizeof(couple));
c->x = x;
c->y = y;
return c;
}
int main()
{
couple *c = creerCouple(1, 2);
}