Il codice che ho usato è questo:

codice:
#define dim 5          //alloco 5 blocchi di memoria per volta(*allocazioni che viene incrementato ogni 5 inserimenti)
        struct mail{
            char indirizzo[30];
        } *email = NULL;
        int i=-1; 
        int n=0;
        int allocazioni=1;    //coefficiente per incrementare i blocchi da reallocare
        int alloc=1;          //dimensione nuovo blocco
        char scelta[2];
        email=(struct mail*)malloc(dim*sizeof(struct mail));
        do {
            i++;
            if (i == allocazioni * dim){   //quando i(num mail) diventa uguale ad un multiplo di 5
                allocazioni++;  //aggiorno il coefficiente
                alloc=allocazioni*dim; //definisco il nuovo blocco
                email=(struct mail*)realloc(email, (alloc*sizeof(struct mail )));  //e rialloco la memoria
            }
            printf("\nInserisci il %d° indirizzo email: ",i+1);
            scanf("%s", email[i].indirizzo);
            printf("\nNuovo indirizzo?: ");
            scanf("%s", scelta);
        } while (strcmp(scelta,"s")==0);
        for (n=0; n<=i; n++) {
            printf("\nMail nr.%d: %s",n+1,email[n].indirizzo);
        }
        free (email);
Se mi dite che sbaglio non c'è dubbio, mi fido ciecamente dell'esperienza ( altrimenti non stavo qui a scrivere), ma non riesco a capire dove:

Ho letto (e spero di aver letto bene) che un vettore di caratteri statico (con il valore di "n" noto) lo dichiaro

char xxx[n];

mentre un vettore di caratteri dinamico lo dichiaro

char *xxx;

perché un vettore di struct dovrebbe essere diverso?

D'altronde il fatto che quando stampo "email[n]" vengono mostrati i valori inseriti, correttamente ed in ordine di inserimento, mi fa supporre che per ogni valore di "n" è stata creata una cella (email[n]) che contiene l'ennesimo dato inserito.

Fatemi capire dove sbaglio altrimenti comincio male