Reputation: 225
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\n");scanf(" %[^\n]s", &student_array[i].name);
printf("Enter Grades\n");scanf("%f", &student_array[i].grades);
printf("Enter Points\n");scanf("%f", &student_array[i].points);
printf("Enter ID\n");scanf("%d", &student_array[i].id);
printf("Enter year\n");scanf("%d", &student_array[i].birth_date.year);
printf("Enter month\n");scanf("%d", &student_array[i].birth_date.month);
printf("Enter day\n");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\n", student_data[i]->name);
printf("average: %f\n", student_data[i]->grades);
printf("academic points: %f\n", student_data[i]->points);
printf("ID: %d\n", student_data[i]->id);
printf("birth year: %d\n", student_data[i]->birth_date.year);
printf("birth month: %d\n", student_data[i]->birth_date.month);
printf("birth day: %d\n", 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);
}
Upvotes: 1
Views: 101
Reputation: 753455
You don't need to use struct Student **
— you can use a single level of pointers, like this:
#include <stdio.h>
#include <stdlib.h>
struct Date
{
int year;
int month;
int day;
};
struct Student
{
char name[100];
float grades;
float points;
int id;
struct Date birth_date;
};
static
struct Student *get_student_data(int *number_of_student)
{
printf("how many students in your class? ");
scanf("%d", number_of_student);
struct Student *student_array = malloc(sizeof(struct Student) * *number_of_student);
if (student_array == NULL)
return NULL;
for (int i = 0; i < *number_of_student; i++)
{
printf("Enter Name\n");
scanf(" %[^\n]s", student_array[i].name);
printf("Enter Grades\n");
scanf("%f", &student_array[i].grades);
printf("Enter Points\n");
scanf("%f", &student_array[i].points);
printf("Enter ID\n");
scanf("%d", &student_array[i].id);
printf("Enter year\n");
scanf("%d", &student_array[i].birth_date.year);
printf("Enter month\n");
scanf("%d", &student_array[i].birth_date.month);
printf("Enter day\n");
scanf("%d", &student_array[i].birth_date.day);
}
return student_array;
}
static
void print_student_data(struct Student* student_data, int number_of_student)
{
for (int i = 0; i < number_of_student; i++)
{
printf("name: %s\n", student_data[i].name);
printf("average: %f\n", student_data[i].grades);
printf("academic points: %f\n", student_data[i].points);
printf("ID: %d\n", student_data[i].id);
printf("birth year: %d\n", student_data[i].birth_date.year);
printf("birth month: %d\n", student_data[i].birth_date.month);
printf("birth day: %d\n", student_data[i].birth_date.day);
}
}
int main(void)
{
int number_of_student = 0;
struct Student* student_data = get_student_data(&number_of_student);
if (student_data != NULL)
{
print_student_data(student_data, number_of_student);
free(student_data);
}
return 0;
}
This simplifies the memory release, too. The code in the question leaks the array of structures (it only frees the array of pointers).
Upvotes: 2