mas[i].marks[j];
Это не обращение к элементу массива mas т.е к marks ?
Так его создать надо до этого.
mas[i].marks = ...
int *mas[i].marks[j]= new int[k];
Так его нужно создать?
Зачем это? Вы ж не пишете string *mas[i].FIO
Спасибо Вам, Alex! Вы как всегда сделали за меня самую сложную работу!