Ошибка сегментации (ядро сброшено) при попытке открыть файл - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь создать программу, которая создает структуру данных людей с их именами и идентификаторами. Когда я это компилирует, нет проблем, но когда он работает, я получаю ошибку сегментации (ядро сбрасывается). Файл находится в той же папке, что и файл .c. Кроме того, внутри файла данные будут разделены табуляцией. Функция list_create () создает структуру данных в виде списка.

Я попытался вместо создания одной строки кода со многими функциями, нескольких строк с несколькими функциями использовать tmp в качестве списка вместо узла, свободные переменные в другом порядке, но это ничего не изменило.

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define MAXSTRING 50
typedef struct{
    char name[MAXSTRING];
    int id;
} student;
typedef struct _node* node;
typedef struct _list* list;

struct _node {
    student data;
    node next;
};

struct _list {
    node head;
    int size;
};


int list_empty(list l){
        assert(l);
        return l->head==NULL;
}
node list_deletefirst(list l){
        assert(l && l->head);
        node ret;
        l->head=l->head->next;
        l->size--;
        ret->next=NULL;
        return ret;
}

void list_freenode(node n){
        assert(n);
        free(n);
}


void load(char*filename,list l){
    FILE *fd;
    node tmp=l->head;
    if((fd=fopen(filename,"r"))==NULL){
        printf("Error trying to open the file");
                abort();
    }
    else{
                while(!feof(fd)){
                fscanf(fd,"%s\t%d\n",tmp->data.name,&tmp->data.id);

                tmp=tmp->next;
                l->size++;
                }

        }

    tmp->next=NULL;
    fclose(fd);
}

void save(char *filename,list l){
    int i;
    node tmp=l->head;
    FILE *fd;   
    rewind(fd);
    if((fd=fopen(filename,"w"))==NULL){
        printf("File could not be opened");
        abort();
    }
    for(i=0;i<l->size;i++){
        fprintf(fd,"%s\t%.4d\n",tmp->data.name,tmp->data.id);
        tmp=tmp->next;
    }
    rewind(fd);
    fclose(fd);
}

int main(int argc,char *argv[]){
    list l=list_create();
    load(argv[1],l);


    save(argv[1],l);

    while (!list_empty(l)){
                list_freenode(list_deletefirst(l));
        }
    free(l);

    return 0;
}

Я ожидаю получить список с именами и идентификаторами.

1 Ответ

1 голос
/ 05 июня 2019
free(l->head->next);
l->head=l->head->next;

Вы освобождаете l->head->next и присваиваете освобожденное значение (мусор) для l->head в следующей строке.

В результате вы читаете мусор (segfault) во второй итерации при попыткедоступ к l->head->next.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...