2017-12-26 19 views
1

저는 사용자가 파일을 읽고 작은 "데이터베이스"를 만들고 항목을 만들거나 삭제할 수있는 작은 프로그램을 작성했습니다.C - Struct 내부의 포인터에 Realloc을 사용할 때 충돌이 발생했습니다.

realloc() 

기능을 사용하려고하면 오류가 발생합니다.

확실하지 내가 뭔가 잘못하고있는 중이 야 만약 내가 C.

그래서

오히려 새로 온 이후, 아마도,하지만, 내가이 방법을 수행하려고 해요 : 내가 무엇

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. 

struct 내부에있는 포인터에 대해 realloc() 함수를 사용하십시오.

이 지금까지 전체 프로그램 : 사전에 어떤 도움

#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); 

} 

감사합니다!

답변

2

이 줄은 어떻게됩니까?

addStudent(studentFile, &database); 

run? 지역 변수에 대한 포인터를 촬영하고 addStudent 함수에 전달되는 경우이 코드는이 수정하지 않고 심지어 닉의 변경 작동하지 않을 수 있다고 생각

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

나는에 대한 realloc을()를 사용하는 것을 시도하고 무엇을 기본적으로

addStudent(studentFile, database); 
+0

감사합니다! 당신 말이 맞아요, 포인터에 대한 포인터. 고맙습니다. C에서 아직 새로운 것입니다. –

4

두 코드 블록이 다른 라인을 사용하고 있습니다. 그 중 하나 (큰 것)가 잘못되었습니다. student 포인터에 대한 참조를 전달하고 있습니까? 그건 필요하지 않습니다. 그냥 포인터 자체를 전달하십시오. 또한 실제 크기가 전달되지 않습니다

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

하지만 첫 번째 코드 샘플이었다 :

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

은이어야한다. 다음 줄이 작동하지 않습니까?

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

방금 ​​질문에서 복사되었습니다. 나는 당신이 가지고있는/시도하지 않은 것과 당신에게 오류를주는 것에 관해 혼란스러워합니다.

또한 오류가 계속 발생하는 minimal example을 더 많이 제공하십시오. 코드를 제거하는 동안 문제를 파악할 수도 있습니다.

+0

struct 내부에있는 포인터 –

+0

'-> '연산자는 이미'struct StudentDB * Database'를 역 참조합니다. – Nick

관련 문제