首页 > 解决方案 > 在从文件创建链表的循环中使用 free() 时出现问题

问题描述

所以我有一个名为 file.txt 的文件,我想根据它包含的信息创建一个链表,其中文件的每一行都是一个新节点。到目前为止,我有这个:

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

typedef struct sAirport{
     char name;
     int number;
     struct sAirport *next;
}tAirport;

tAirport *createNode(tAirport *newNode, char str[1000]);
void createLinkedList(tAirport **head, tAiport *newNode);

int main()
{
     FILE *fa = fopen("test.txt", r);
     char str[1000] = {0};
     tAirport *head = NULL;
     tAirport *newNode = NULL;

     while(fgets(str, sizeof(str), fa) != NULL)
     {
          newNode = createNode(newNode, str);
          createLinkedList(&head, newNode);
          free(newNode);
          newNode = NULL;
     }
     return 0;
}

tAirport *createNode(tAirport *newNode, char str[1000])
{
     char *aux = NULL;
     newNode = malloc(sizeof(tAirport));

     if(newNode == NULL)
          exit(EXIT_FAILURE);

     aux = strtok(str, " ");
     strcpy(&newNode->name, aux);

     aux = strtok(NULL, " ");
     sscanf(aux, "%d", &newNode->number);

     newNode->next = NULL;

     return newNode;
}

void createLinkedList(tAirport **head, tAirport newNode)
{
     tAirport *temp = NULL;

     if(*head == NULL)
     {
          *head = newNode;
          return;
     }

     temp = *head;
     while(temp->next != NULL)
          temp = temp->next;
     temp->next = newNode;
}

我得到了奇怪的结果,Valgrind 说我丢失了字节,但我不知道该怎么做。

编辑使其可以运行。

例如,我正在测试的文件是:

约翰 33

玛丽 42

彼得 12

我应该怎么办?

标签: clinked-listfree

解决方案


sAirport结构将名称定义为一个字符。但是,从代码来看,似乎createNode将允许长名称(最多 999 个字符)。当createNode创建新条目时,strcpy 将覆盖超出分配空间的数据,并可能导致分段错误或“有趣”数据。

考虑将 name 扩展到适当的大小,或对 name 使用动态分配 (malloc)。


推荐阅读