Search code examples
cfunctionpointersstructuredynamic-memory-allocation

How to add new a new structure student using pointers and dynamic memory


My current code takes user input and collects student information. I am trying to write a function that will allow the user to add a new student. I reallocated the memory and passed everything into the function, but when I compile and run the program it outputs garbage for the new student instead of the new student details. Any help is appreciated.

Struct

struct student
{
    char fname[20];
    char lname[20];
    float score;
};

Prototype

void addStudents(struct student *s, int student_size);

Main

int main()
{
    int base_number, i;
    int students;

    struct student *ptr;

    printf("Enter Number of Students: ");
    scanf("%d", &base_number);

    ptr = (struct student*)malloc(base_number * sizeof(struct student));
    students = base_number;

    printf("\nEnter Student Information\nExample: John Smith 98.50\n\n");

    for(i = 0; i < base_number; i++)
    {
        printf("Student %d: ", i+1);
        scanf("%s %s %f", (ptr+i)->fname, (ptr+i)->lname, &(ptr+i)->score);
    }

    printStudents(ptr, students);

    students++;
    ptr = realloc(ptr, students * sizeof(struct student));

    addStudents(ptr, students);


    //Getting garbage for new student
    printStudents(ptr, students);

    return 0;
}

addStudents Function

void addStudents(struct student *s, int student_size)
{
    printf("\nAdd A Student\nStudent Information: ");
    scanf("%s %s %f", (s+student_size)->fname, (s+student_size)->lname, &(s+student_size)->score);
}

Solution

  • Do not increase students before you call addStudents.

    Otherwise it is out of the bounds of the array (and are editing a different student).

    students++;
    ptr = realloc(ptr, students * sizeof(struct student));
    addStudents(ptr, students);
    

    Should be

    ptr = realloc(ptr, (students + 1) * sizeof(struct student));
    addStudents(ptr, students);
    students++;