Max Medina
Max Medina

Reputation: 190

Unhandled exception shows up when setting a dynamic vector in C using realloc

For a homework assignment, I am trying to create a dynamic vector called Student_List but I have an issue with the Add_Student function.

I get the following error:

Unhandled exception at 0x589BB2CE(msvcr120d.dll) in ConsoleApplication1.exe:
0xC00000005: Access violation reading location 0xCCCCCCCC8.

Here is my code:

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int Assignment1;
    int Assignment2;
    int Assignment3;
    int Assignment4;
    int Assignment5;
    int FinalGrade;
}Grade;

typedef struct{
    int Id;
    char *FirstName;
    char *LastName;
    Grade Grade;
}Student;

typedef struct{
    Student *Students;
    int Size;
}Student_List;

void Init_Student(Student *);
//CRUD
void Create_Student(Student **student);
void Read_Student(Student *);
void Update_Student(Student *);
void Delete_Student(Student **);

//Student Repository
void Add_Student(Student_List *List, Student*);
void Get_Student_By_Id(Student_List *List, int index);
void Remove_Student(Student_List *List, int index);

int main(){

    //Create Student List
    Student_List student_list;
    student_list.Size = 0;
    Student *student = NULL;
    Create_Student(&student);
    Read_Student(student);

    Add_Student(&student_list, student);

    Delete_Student(&student);
    free(student_list.Students);

}

void Create_Student(Student **student){
    *student = (Student*)malloc(sizeof(Student));
    if (student == NULL){
        printf("\nOut of memory!");
        exit(1);
    }
}

void Init_Student(Student *student){
    student->FirstName = (char*)malloc(128 * sizeof(char));
    student->LastName = (char*)malloc(128 * sizeof(char));
    if (student->FirstName == NULL || student->LastName == NULL){
        printf("\nOut of memory!");
        exit(1);
    }
}

void Read_Student(Student *student){

    Init_Student(student);

    printf("Introduzca el Nombre y el Apellido (ej: Max Medina): ");
    scanf("%s %s", student->FirstName, student->LastName);

    Grade grade;
    printf("Introduzca las Calificaciones (ej: 7 8 9 10 6): ");
    scanf("%d %d %d %d %d", &grade.Assignment1, &grade.Assignment2, &grade.Assignment3, &grade.Assignment4, &grade.Assignment5);
    student->Grade = grade;
}

void Update_Student(Student *student){
    Grade grade;
    printf("Introduzca las Calificaciones (ej: 7 8 9 10 6): ");
    scanf("%d %d %d %d %d", &grade.Assignment1, &grade.Assignment2, &grade.Assignment3, &grade.Assignment4, &grade.Assignment5);
    student->Grade = grade;
}

void Delete_Student(Student **student){
    free(*student);
}

void Add_Student(Student_List *List, Student *student){
    //List->Size++;
    List->Students = (Student*) realloc(List->Students, List->Size++ * sizeof(Student));
    int index = List->Size - 1;

    //List->Students[index] = *student;
}

Upvotes: 1

Views: 89

Answers (1)

barak manos
barak manos

Reputation: 30136

The argument passed to realloc must be a pointer to a memory block previously allocated with malloc, calloc or realloc.

Alternatively, this argument can be a null pointer, in which case a new block is allocated (as if malloc was called).

In your code, it is neither.

You can fix that by initializing student_list.Students = NULL before passing it to Add_Student.

Upvotes: 1

Related Questions