Not relevant to compiler warnings, but your original malloc is wrong; Do you want to:
malloc(sizeof(student *)* numStudents)
To make room for numStudents pointers for the student. Line:
students[x] = (struct student*)malloc(sizeof(student));
Must be:
students[x] = (student*)malloc(sizeof(student));
There is no such thing as a "struct student". You have declared an unnamed structure and typedef'd it is a "student". Compare and compare with:
struct student { char* firstName; char* lastName; int day; int month; int year; };
To create a type of "struct student", but requires you (in C) to explicitly refer to the struct student, and not just to the student elsewhere. This rule has been changed for C ++, so your compiler may be a bit fuzzy.
Concerning:
student* newStudent = {"john", "smith", 1, 12, 1983};
It should be:
student newStudent = {"john", "smith", 1, 12, 1983};
Since the curly brace syntax is a direct literal, and not something else you need to specify.
EDIT: upon reflection, I think aaa may have taken more review of this than me. Is it possible that you inadvertently use an extra level of pointer dereferencing everywhere? Therefore you need to:
student* students = malloc(sizeof(student) * numStudents); int arrayIndex = 0;
and
student newStudent = {"john", "smith", 1, 12, 1983};
Specify that the array is not used outside the scope of newStudent. Otherwise, copying pointers to strings incorrectly.