Глядя на этот цикл, кажется, есть пара ошибок.
- Вы создаете один головной узел, но затем не выделяете дополнительную память для каждой из строк во время чтения
- Кажется, что в первой итерации используется неинициализированный указатель (возможно, сбой или повреждение памяти).
- В следующей итерации используется нулевой указатель (почти наверняка, сбой).
Обозначая цикл, который у вас был:
void createlistlocals(t_local *header_l){
FILE *fp;
t_local *aux;
t_local *aux1;
aux1 = header_l; // aux1 = head, aux is uninitialised
char *line = malloc(150*sizeof(char)); // needs to be freed at the end
char *name1 = malloc(150*sizeof(char));
char c;
fp = fopen("locais.txt","r");
fgets(line, 150, fp); // assumuming linha == line
// Note, there are ways to loop until the actual file end rather thna a "special line"
while (strcmp(line, "end")!=0){
puts(line);
name1 =strtok(line, "/"); // Assuming the rest of the line is not important.
puts(name1);
// aux was uninitialised, so this will be undefined behaviour and either crash or
// overwrite something (memory corruption) that may cause strange things later
// (including crashes)
aux->name = strdup(name1);
// cria_cabecalhoL set header_l->next to null, so this is not actually creating a new node.
// and the next loop will actually try to use null->name and that is basically garunteed
// to crash on most systems.
aux->next = aux1->next;
aux1->next= aux;
aux1 = aux;
fgets(line, 150, fp); // This is duplicate, could be once at the start of the loop, maybe use for(...) loop
}
aux1 = header_l; // Note, assigning a local here at the end doesn't do anything
}
Исправление ошибок, связанных со связанным списком, и допущение, что t_local->name == NULL
является значением вашего конечного стража.
t_local *cria_cabecalhoL(void){
t_local *lista = (t_local*)malloc(sizeof(t_local));
if (lista != NULL)
lista->name = NULL; // no data, empty node
lista->next = NULL;
return lista;
}
void createlistlocals(t_local *header_l){
FILE *fp;
t_local *node = header_1;
t_local *next;
char *line = malloc(150*sizeof(char)); // needs to be freed at the end
char *name1;
fp = fopen("locais.txt","r");
fgets(line, 150, fp);
while (strcmp(line, "end")!=0){
puts(line);
name1 =strtok(line, "/");
puts(name1);
node->name = strdup(name1);
// And create a new empty node for the next loop
next = cria_cabecalhoL();
node->next = next; // New node comes after the current one.
node = next; // And now using the next node on loop
fgets(line, 150, fp);
}
}