Не связано с предупреждениями компилятора, но ваш исходный malloc неверен; Вы хотите:
malloc(sizeof(student *)* numStudents)
Чтобы выделить место для общего количества указателей 'numStudents' для студента. Линия:
students[x] = (struct student*)malloc(sizeof(student));
Должно быть:
students[x] = (student*)malloc(sizeof(student));
Нет такой вещи, как "структура студента". Вы объявили безымянную структуру и напечатали ее как 'student'. Сравните и сопоставьте с:
struct student
{
char* firstName;
char* lastName;
int day;
int month;
int year;
};
Который мог бы создать тип «struct student», но потребовал бы, чтобы вы (в C) явно ссылались на struct student, а не просто на студент в другом месте. Это правило изменено для C ++, поэтому ваш компилятор может быть немного нечетким по этому поводу.
Что касается:
student* newStudent = {"john", "smith", 1, 12, 1983};
Это должно быть:
student newStudent = {"john", "smith", 1, 12, 1983};
Поскольку синтаксис фигурных скобок является прямым литералом, а не чем-то другим, на что вам нужно указать.
РЕДАКТИРОВАТЬ: поразмыслив, я думаю, ааа, возможно, взял больше обзора этого, чем я. Возможно ли, что вы случайно используете дополнительный уровень разыменования указателя повсюду? Итак, вы хотите:
student* students = malloc(sizeof(student) * numStudents);
/* no need for this stuff: */
/*int x;
for(x = 0; x < numStudents; x++)
{
//here I get: "assignment from incompatible pointer type"
students[x] = (struct student*)malloc(sizeof(student));
}*/
int arrayIndex = 0;
И
student newStudent = {"john", "smith", 1, 12, 1983};
//add it to the array
students[arrayIndex] = newStudent;
arrayIndex++;
Подчеркнуть, что массив не используется вне области newStudent. В противном случае копирование указателей на строки некорректно.