2017-12-26 36 views
1

Ich habe ein kleines Programm geschrieben, mit dem der Benutzer eine Datei lesen, eine kleine "Datenbank" erstellen und Einträge erstellen oder löschen kann. Wenn ich versuche, die Funktion zu verwenden, stürzt es ab.C - Absturz bei der Verwendung von Realloc auf einem Zeiger in einem Struct

nicht sicher, ob ich etwas falsch zu machen, bin wohl aber, da ich zu C recht neu bin

Also versuche ich es auf diese Weise zu tun:

StudentDB database; 
//More code in between, that does include malloc() 
database->students = realloc(database->students, (database->numberOfStudents + 1) * sizeof(Student)); 
//It crashes when it gets to that part. 

Was ich bin Zu versuchen, zu tun, ist die Realloc() -Funktion für einen Zeiger, der innerhalb einer Struktur ist.

Dies ist das gesamte Programm so weit:

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

typedef struct Lesson { 
    char *name; 
    int semester; 
    float grade; 
} Lesson; 

typedef struct Student { 
    char *name; 
    char *surname; 
    int id; 
    int numberOfLessons; 
    Lesson *lesson; 
} Student; 

typedef struct Database { 
    int numberOfStudents; 
    Student *student; 
} StudentDB; 

static int maxNameSize = 100; 
static int autoclear = 1; 


void addStudent(FILE *studentFile, StudentDB *database) { 
    database->numberOfStudents++; 
    printf("\nAdded +1 to number of students"); 
    database->student = realloc(&database->student, 10); 
// 
// printf("Name of the student: "); 
// scanf("%s", database.student[database.numberOfStudents].name); 
} 

void clear() { 
    if(autoclear) { 
     system("cls"); 
    } 
} 

Lesson getNextLesson(FILE *studentFile) { 
    Lesson lesson; 

    lesson.name = malloc(maxNameSize * sizeof(char)); 
    if(!lesson.name) { printf("Memory Allocation has failed. Exiting the program!"); exit(0); } 
    fscanf(studentFile, "%s", lesson.name); 

    fscanf(studentFile, "%d", &lesson.semester); 

    fscanf(studentFile, "%f", &lesson.grade); 

    printf("\n\t%s %d || %.2f\n", lesson.name, lesson.semester, lesson.grade); 
    return lesson; 
} 

Student getNextStudent(FILE *studentFile) { 
    Student student; 

    student.name = malloc(maxNameSize * sizeof(char)); 
    if(!student.name) { printf("Memory Allocation has failed. Exiting the program!"); exit(0); } 
    fscanf(studentFile, "%s", student.name); 

    student.surname = malloc(maxNameSize * sizeof(char)); 
    if(!student.surname) { printf("Memory Allocation has failed. Exiting the program!"); exit(0); } 
    fscanf(studentFile, "%s", student.surname); 

    fscanf(studentFile, "%d", &student.id); 

    fscanf(studentFile, "%d", &student.numberOfLessons); 

    printf("%d || %s %s || %d\n", student.id, student.name, student.surname, student.numberOfLessons); 

    int lesson; 

    student.lesson = malloc(student.numberOfLessons * sizeof(Lesson)); 

    for(lesson = 0; lesson < student.numberOfLessons; lesson++) { 
     student.lesson[lesson] = getNextLesson(studentFile); 
    } 
    return student; 
} 

void loadStudents() { 

} 

void run(FILE *studentFile, StudentDB *database) { 
    int answer; 
    do { 
     clear(); 
     answer = menu(); 
     switch(answer) { 
      case 1: { 

       break; 
      } 
      case 2: { 

       break; 
      } 
      case 3: { 
       addStudent(studentFile, &database); 
       break; 
      } 
      case 4: { 

       break; 
      } 
     } 
    } while(answer < 0 || answer > 9); 
} 

int menu() { 
    int answer; 
    printf("1. Load students records from file\n"); 
    printf("2. Save students records to file\n"); 
    printf("3. Add a student record\n"); 
    printf("4. Delete a student record by student id\n"); 
    printf("5. Display a student record by student id\n"); 
    printf("6. Display a student record by student surname\n"); 
    printf("7. Display all student records\n"); 
    printf("8. Find the lesson average for all students\n"); 
    printf("9. Exit\n"); 

    printf("Enter the number of the thing you would like to do: "); 
// scanf("%d", &answer); 
    return 3; 
} 

void programInfo() { 
    printf("\n\n====================================================\n\tProgram Info\n\n This program was created by KKosyfarinis\n\n [email protected]\n====================================================\n\n"); 
} 

void readData(FILE *studentFile, StudentDB *db) { 
    int i; 

    printf("Running the loop\n"); 
    for(i = 0; i < db->numberOfStudents; i++) { 
     printf("=====================\n\n\tStudent #%d\n", i); 
     db->student[i] = getNextStudent(studentFile); 
     printf("\n\tCompleted\n\n=====================\n"); 
    } 

    clear(); 
} 

void saveStudents() { 

} 

void main() { 

    system("color 02"); 
    system("@echo off"); 

    FILE *studentFile; 
    StudentDB database; 

    studentFile = fopen("students.txt", "r+w"); 

    int numberOfStudents; 

    //Set the number of students 
    fscanf(studentFile, "%d", &database.numberOfStudents); 

    //Prints the number of students 
    printf("Number of students: %d\n", database.numberOfStudents); 

    //Set the memory allocation 
    database.student = malloc(database.numberOfStudents * sizeof(Student)); 
    if(!database.student) { 
     printf("The memory allocation has failed. Exiting the program!"); 
     exit(0); 
    } 

    //Read the students 
    readData(studentFile, &database); 

    programInfo(); 
    run(studentFile, &database); 

} 

Vielen Dank im Voraus für jede Hilfe!

Antwort

2

Was ist mit dieser Linie?

addStudent(studentFile, &database); 

in run Funktion? Wo Zeiger auf lokalen Variable abgelegt und bestanden auf addStudent Funktion

void run(FILE *studentFile, StudentDB *database) { 
    ... 
    case 3: { 
     addStudent(studentFile, &database); // <-- get pointer to local variable 

ich diesen Code nicht einmal denken, mit Nicks Änderungen ohne diese Modifikation

addStudent(studentFile, database); 
arbeiten kann
+0

Danke! Du hast recht, Ein Zeiger auf einen Zeiger. Danke dafür, immer noch ziemlich neu für C. Werde in Zukunft auf die Leute aufpassen! –

4

Sie sind zwei Codeblöcke haben unterschiedliche Zeilen. Eine davon (die größere) ist falsch. Sie übergeben eine Dereferenz an den Zeiger student? Das wird nicht benötigt, übergeben Sie einfach den Zeiger selbst.

database->student = realloc(&database->student, 10); 

Sollten sein:

database->student = realloc(database->student, 10); 

Sie sind auch nicht in einer realistischen Größe vorbei, aber Ihr erstes Codebeispiel war. Funktioniert die folgende Zeile nicht?

database->students = realloc(database->students, (database->numberOfStudents + 1) * sizeof(Student)); 

Das wurde nur von Ihrer Frage kopiert. Ich bin verwirrt darüber, was du nicht versucht hast und was dir den Fehler gibt.

Auch in der Zukunft bieten mehr von minimal example, die immer noch den Fehler erzeugt. Es besteht auch die Möglichkeit, dass Sie das Problem lösen, während Sie den Code entfernen.

+0

Im Grunde, was ich versuche, realloc() für ein zu verwenden, Zeiger, der innerhalb einer Struktur ist –

+0

Nun, der '->' Operator dereferenziert bereits die 'struct StudentDB * Database'. – Nick

Verwandte Themen