Ragazzi il codice che ho postato non mi dà nessun errore, la function aggiungi, sembra funzionare ma nel momento in cui rientro nell'applicazione e clicco 2 per stampare lo statino degli studenti, il programma smette di funzionare, e inizialmente mi stampa vicino agli appositi cout dei caratteri strani. Mentre una volta inserito uno studente cerco di stampare lo statino tramite matricola(case 3 non stampa a video nulla, mi chiede solo se ritornare all'applicazione.
Come mai? Forse il tipo di dati String non è dichiarato correttamente?
C'è un problema nella dichiarazione dinamica della struttura?

Grazie anticipatamente,
gaten

codice:
#include<iostream>
using namespace std;

typedef char String[30];

typedef struct {
	int giorno;
	int mese;
	int anno;
} Data;

typedef struct {
	String materia;
	int codice;
	int voto;
	Data data_esame;
} Esame;


typedef struct {
	String matricola;
	String nome;
	String cognome;
	Esame *vettEsamiSuperati;
	unsigned int numeroEsamiSuperati;
	unsigned int esamiSostenuti;
} Studente;


Studente aggiungi(Studente *vettStudenti, int &num_stud);
void statino(Studente *vettStudenti, int num_stud);
void statino_m(Studente *vett,String matr,int num);
int main()
{
	int scelta;
	int num_stud=0;
	char continua, yes;
	String mat;
	Studente *vettStudenti;

    do{
		cout<<"*****************************************************"<<endl;
		cout<<"**************** CARRIERA ACCADEMICA ****************"<<endl;
		cout<<"_1) Aggiungi uno studente____________________________"<<endl;
		cout<<"_2) Stampa statino di tutti gli studenti_____________"<<endl;
		cout<<"_3) Stampa lo statino di uno studente(data la matr.)_"<<endl;
		cout<<"_____________________________________________________"<<endl;
		cin>>scelta;

		switch (scelta){
			case 1:
				// aggiungi uno studente;
				do{
					cout<<"INSERIMENTO STUDENTE NUMERO "<<num_stud+1<<endl;
					aggiungi(vettStudenti, num_stud);
					cout<<"Vuoi inserire un altro studente?"<<endl;
					cin>>continua;
				} while (continua == 's' || continua == 'S');
				break;

			case 2:
				// stampa lo statino di tutti gli studenti
				statino(vettStudenti, num_stud);
				break;

			case 3:
				// stampa lo statino di uno studente data la matricola
                if(num_stud > 0){
                    cout << "Inserire matricola"<<endl;
                    cin>>mat;
                    statino_m(vettStudenti,mat, num_stud);
                }else{
                    cout<<"Non è presente nessuno studente!"<<endl;
                }
				break;
		}
		cout<<"Continuare ad usare l'applicazione"<<endl;
        cin>>yes;
    } while (yes=='s' || yes=='S');

}


/* function per aggiungere gli studenti */
Studente aggiungi(Studente *vettStudenti, int &num_stud){

	int N_ESAMI;
	int superati;
	vettStudenti=new Studente [num_stud];

	cout<<"INFO PERSONALI STUDENTE"<<endl;
	cout<<"Inserisci il nome dello studente:"<<endl;
	cin>>vettStudenti[num_stud].nome;
	cout<<"Inserisci il cognome dello studente:"<<endl;
	cin>>vettStudenti[num_stud].cognome;
	cout<<"Inserisci la matricola dello studente:"<<endl;
	cin>>vettStudenti[num_stud].matricola;
	cout<<endl<<"INFO ESAMI:"<<endl;
	cout<<"Quanti esami ha sostenuto lo studente?"<<endl;
	cin>>N_ESAMI;

    vettStudenti[num_stud].vettEsamiSuperati=new Esame [N_ESAMI];

	vettStudenti[num_stud].esamiSostenuti=N_ESAMI;

	for(int i=0; i<N_ESAMI; i++){

		cout<<"ESAME NUMERO "<<i+1<<endl;
		cout<<"Inserisci la materia dell'esame:"<<endl;
		cin>>vettStudenti[num_stud].vettEsamiSuperati[i].materia;
		cout<<"Inserisci il codice dell'esame:"<<endl;
		cin>>vettStudenti[num_stud].vettEsamiSuperati[i].codice;
		cout<<"Inserisci il voto dell'esame:"<<endl;
		cin>>vettStudenti[num_stud].vettEsamiSuperati[i].voto;

		if (vettStudenti[num_stud].vettEsamiSuperati[i].voto >= 18 || vettStudenti[num_stud].vettEsamiSuperati[i].voto <= 30){
			superati++;
		}

		cout<<"Inserisci la data dell'esame:"<<endl;
		cout<<"Giorno:\t";	cin>>vettStudenti[num_stud].vettEsamiSuperati[i].data_esame.giorno;
		cout<<endl<<"Mese:\t";	cin>>vettStudenti[num_stud].vettEsamiSuperati[i].data_esame.mese;
		cout<<endl<<"Anno:\t";	cin>>vettStudenti[num_stud].vettEsamiSuperati[i].data_esame.anno;
	}
	vettStudenti[num_stud].numeroEsamiSuperati=superati;
	num_stud++;
}


/* function per stampare a video tutti gli studenti e il relativo statino */
void statino(Studente *vettStudenti, int num_stud){

	if(num_stud > 0){
		for (int i=0; i<num_stud; i++){

			cout<<"STUDENTE NUMERO "<<i+1<<" CON MATRICOLA "<<vettStudenti[i].matricola<<endl;
			cout<<"Nome studente:\t"<<vettStudenti[i].nome<<endl;
			cout<<"Cognome studente:\t"<<vettStudenti[i].cognome<<endl;

			cout<<endl<<"ESAMI SUPERATI:"<<endl;
			cout<<"_______________________________________________________________________________"<<endl;
			for (int h=0; h<vettStudenti[i].esamiSostenuti; h++){

				if (vettStudenti[i].vettEsamiSuperati[i].voto > 18){

					cout<<"Nome materia:\t"<<vettStudenti[i].vettEsamiSuperati[h].materia<<  "\t|"<<endl;
					cout<<"Codice esame:\t"<<vettStudenti[i].vettEsamiSuperati[h].codice<<	"\t|"<<endl;
					cout<<"Voto esame:\t"<<vettStudenti[i].vettEsamiSuperati[h].materia<<	"\t|"<<endl;
					cout<<"Data esame:\t"<<vettStudenti[i].vettEsamiSuperati[h].data_esame.giorno<<"-";
					cout<<vettStudenti[i].vettEsamiSuperati[h].data_esame.mese<<"-";
					cout<<vettStudenti[i].vettEsamiSuperati[h].data_esame.anno<<"\t|";
				}
			}
			cout<<"_______________________________________________________________________________"<<endl;
		}
	}
	else
	{
		cout<<"Non è presente nessuno studente!"<<endl;
	}

}

/* function per stampare a video lo statino di un singolo studente
   (data in input la matricola)
   */
void statino_m(Studente *vettStudenti, String matr, int num_stud){
    int i,j;

        i=0;
        do{
            if (vettStudenti[i].matricola == matr){
                cout<<"STUDENTE: "<<i<<endl;
                cout<<"Nome: "<<vettStudenti[i].nome<<endl;
                cout<<"Cognome: "<<vettStudenti[i].cognome<<endl;
                cout<<"Matricola: "<<vettStudenti[i].matricola<<endl;
                cout<<"Esami superati: "<<vettStudenti[i].numeroEsamiSuperati<<endl;

                for (int h=0; h<vettStudenti[num_stud].esamiSostenuti; h++){

                    if (vettStudenti[num_stud].vettEsamiSuperati[i].voto > 18){

                        cout<<"Nome materia:\t"<<vettStudenti[num_stud].vettEsamiSuperati[h].materia<<  "\t|"<<endl;
                        cout<<"Codice esame:\t"<<vettStudenti[num_stud].vettEsamiSuperati[h].codice<<	"\t|"<<endl;
                        cout<<"Voto esame:\t"<<vettStudenti[num_stud].vettEsamiSuperati[h].materia<<	"\t|"<<endl;
                        cout<<"Data esame:\t"<<vettStudenti[num_stud].vettEsamiSuperati[h].data_esame.giorno<<"-";
                        cout<<vettStudenti[num_stud].vettEsamiSuperati[h].data_esame.mese<<"-";
                        cout<<vettStudenti[num_stud].vettEsamiSuperati[h].data_esame.anno<<"\t|";
                    }
                }
            }
            i++;
        } while (vettStudenti[i].matricola != matr && i<num_stud);
}