首页 > 解决方案 > 尝试写入文件时出现分段错误

问题描述

我正在学习链表以及如何使用它,我制作了一个简单的程序,用这种方法存储和打印学生的年龄和姓名。我想做其他事情,我想将学生的这些数据存储在一个文本文件中。但是当我尝试写入这个文件时,它会抛出一个语义错误错误。

这是代码:

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

typedef struct student {
      char * name;
      int age;
      struct student *next;
}student;

student * createStudent(char *, int);
student * append(student *, student *);
void printStudents(student *, int);
void storeStudents(student *, int, int flag);

int main(){
    student *end, *start , *newStudent, *tmp;
    int studentAge, nStudents, i = 1;
    char * studentName = (char *)malloc(sizeof(char) *50);
    if(!studentName){
        printf("Couldn't allocate the memory\n");
        exit(EXIT_FAILURE);
    }
    printf("Enter the number of students : ");
    scanf("%d", &nStudents);
    while(nStudents > 0){
        printf("Enter the age from the %d student: ", i);
        scanf("%d", &studentAge);
        printf("Enter the name from the %d student: ", i);
        scanf("%s", studentName);
         if((i-1) ==0){
            start = createStudent(studentName, studentAge);
            end = start;
            storeStudents(start, i , 0);
            printStudents(start, i);
        }else{
            newStudent = createStudent(studentName, studentAge);
            end = append(end, newStudent);
            storeStudents(end, i , 1);
            printStudents(end, i);
        }
        nStudents--;
        i++;
    }
    tmp = start -> next;
    free(start);
    start = tmp;
    tmp = start->next;
    free(start);
    free(tmp);
    return 0;
}

void printStudents(student * start, int i){
    if(start != NULL) printf("Student number %d\nName: %s\nAge: %d\n", i, start -> name, start -> age);
    return;
}

void storeStudents(student * ptr, int i, int flag){
    FILE *pfile = NULL;
    switch (flag){
    case 0: pfile = fopen("students.txt", "w+"); break;
    case 1: pfile = fopen("students.txt", "a+"); break;  
    }
    if(!pfile){
        fprintf(stderr, "Couldn't open the file\n");
        exit(EXIT_FAILURE);
    }
    else if(ptr != NULL){
        fprintf(pfile, "Student number %d\nName: %s\nAge: %s\n", i, ptr -> name, ptr -> age);
    }
    fclose(pfile);
    pfile = NULL;
    return;
}

student * createStudent(char * name, int age){
    student * ptr = NULL;
    ptr = (student *) malloc(sizeof(student));
    ptr->name = (char *)malloc(sizeof(char) *50);
    if(!ptr || !(ptr ->name)){
        printf("Couldn't allocate the memory\n");
        exit(EXIT_FAILURE);
    }
    ptr-> age = age;
    ptr ->name = name;
    ptr ->next = NULL;
    return ptr;
}

student * append(student * end, student * new){
    end->next = new;
    end = new;
    return end;
}

错误发生在函数 storeStudents 中。

是什么导致了这个错误?

标签: cfile

解决方案


好的,我使用在线 C 编译器/调试器运行了这段代码,它告诉我 segfault 位于 fprintf() 行,您在年龄输出上的类型 string / int 类型不匹配。

这与您的 createStudent 没有进行字符串复制并且没有释放所有 malloc 的内存相结合,都在您的应用程序中造成错误。

我重新运行了您的代码:

fprintf(pfile, "Student number %d\nName: %s\nAge: %d\n", i, ptr -> name, ptr -> age);

它不再出现段错误。

请同时解决其他问题。


推荐阅读