Дамп ядра при загрузке файла - PullRequest
0 голосов
/ 10 июня 2019

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

Program received signal SIGSEGV, Segmentation fault.
0x0000555555554c46 in load (filename=0x7fffffffe2ab "students.txt", 
    l=0x555555757260) at Student.c:92
92                  tmp->next=malloc(sizeof(struct _node));

Я пытался изменить feof чем-то другим, использовать с и без ferror и изменить режим для fopen на r вместо a.

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.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;
};


list list_create(){
    list l=(list) malloc(sizeof(struct _list));
    assert(1);
    l->head=NULL;
    l->size=0;
    return l;
}
void load(char*filename,list l){
    FILE *fd=fopen(filename,"r");
    node tmp=l->head;

    if(fd==NULL){
        printf("Error trying to open the file\n");
                abort();
    }
    else{

                while(!feof(fd)&&!ferror(fd)){

        fscanf(fd,"%s\t%d\n",tmp->data.name,&tmp->data.id);   
                tmp->next=(node)malloc(sizeof(struct _node));
        assert(tmp->next);
        tmp=tmp->next;                
        l->size++;
            if (tmp==NULL){
                printf("Error trying to allocate memory\n");
                abort();
            }
                }      
        }

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



int main(int argc,char *argv[]){ 
list l=list_create();
if(argc!=2){
        printf("Input Error\n");
    }
    load(argv[1],l);
\*Some code*\


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

    free(l);
        return 0;

Я ожидаю успешной загрузки файла, возможности редактирования его компонентов и их сохранения.

1 Ответ

1 голос
/ 10 июня 2019

Ваша ошибка сегментации может быть объяснена тем фактом, что ваша функция list_create() выделяет одну структуру данных, но ваша функция load() заполняет столько строк данных, сколько строк в файле, таким образом записывая данные в нераспределенное пространство.

...