I have an assignment of dynamic allocation for an array of structs. I'm having trouble to understand/explain why I need pointer to pointer and not like with regular array only pointer, Maybe someone can explain? The code as following i added the whole code including main function.
struct Date {
int year;
int month;
int day;
};
struct Student {
char name[100];
float grades;
float points;
int id;
struct Date birth_date;
};
struct Student** get_student_data(int* number_of_student)
{
printf("how many students in your class? ");
scanf("%d", number_of_student);
struct Student** student_pointers_array = malloc(sizeof(struct Student*) * *number_of_student);
if (student_pointers_array == NULL)
return;
struct Student* student_array = malloc(sizeof(struct Student) * *number_of_student);
if (student_array == NULL)
return;
for (int i = 0; i < *number_of_student; i++)
{
printf("Enter Name
");scanf(" %[^
]s", &student_array[i].name);
printf("Enter Grades
");scanf("%f", &student_array[i].grades);
printf("Enter Points
");scanf("%f", &student_array[i].points);
printf("Enter ID
");scanf("%d", &student_array[i].id);
printf("Enter year
");scanf("%d", &student_array[i].birth_date.year);
printf("Enter month
");scanf("%d", &student_array[i].birth_date.month);
printf("Enter day
");scanf("%d", &student_array[i].birth_date.day);
student_pointers_array[i] = &student_array[i];
}
return student_pointers_array;
}
void print_student_data(struct Student** student_data, int number_of_student)
{
for (int i = 0; i < number_of_student; i++)
{
printf("name: %s
", student_data[i]->name);
printf("average: %f
", student_data[i]->grades);
printf("academic points: %f
", student_data[i]->points);
printf("ID: %d
", student_data[i]->id);
printf("birth year: %d
", student_data[i]->birth_date.year);
printf("birth month: %d
", student_data[i]->birth_date.month);
printf("birth day: %d
", student_data[i]->birth_date.day);
}
}
void main()
{
int number_of_student = 0;
struct Student** student_data = get_student_data(&number_of_student);
if (student_data == NULL)
return;
print_student_data(student_data, number_of_student);
free(student_data);
}