codice:
int main(int agrc,char **agrv)
{
    char *buffer;
    lista *stack1,*stack2;
    int *num1,*num2,i;
    bool continue;
    num1=(int*)malloc(sizeof(int));
    num2=(int*)malloc(sizeof(int));
    (*num1)=0;
    (*num2)=0;
    if(num==NULL)
        MERROR
    printf("Inserire la prima lista di strutture:\n");
    do
    {
        insert(stack1,num1);
        printf("Continuare ad inserire elementi?-->");
        buffer=input();
        continue=(atoi(buffer));
        free(buffer);
    }while(continue);
codice:
char *input (void)
{
    char *buffer;
    char seeker;
    int size=1;
    buffer=(char*)malloc(sizeof(char));
    if(buffer==NULL)
        MERROR
    while((seeker=getchar())!=10)
    {
        buffer[size-1]=seeker;
        buffer=(char*)realloc(buffer,sizeof(char*));
        if(buffer==NULL)
            MERROR
    }
    buffer[size-1]='\0';
    return buffer;
}

bool insert(lista *ptr,int *num)
{
    (*num)++;
    char *buffer;
    if((*num)==1)
    {
        ptr=(lista*)malloc(sizeof(lista));
        if(ptr==NULL)
            MERROR
    }
    else
    {
        ptr=(lista*)realloc(ptr,(*num)*sizeof(lista));
        if(ptr==NULL)
            MERROR
    }
    printf("Inserisci nome:-->");
    ptr[*num-1].nome=input();
    printf("Inserisci cognome:-->");
    ptr[*num-1].cognome=input();
    printf("Inserisci eta:-->");
    buffer=input();
    ptr[*num-1]=atoi(buffer);
    free(buffer);
    return true;
}
E' un pò strutturata la cosa,comunque sono queste le funzioni,uso la realloc come vedi.