c - 在循环中使用 free() 从文件创建链接列表时出现问题

标签 c linked-list 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 章

5 月 42 日

彼得12

我应该做什么?

最佳答案

除了编译此文件时您会收到的所有警告之外。我只是想告诉您,您误解了 malloc()free() 和指针的工作原理。

首先,指针只是一个unsigned long,一个自然数,就像任何其他数字一样。不同之处在于指针存储实际内存的地址(在本例中为newNode)。

在你的程序中,你malloc()来获取你的内存,将内存地址分配给newNode,然后你告诉你的列表保存newNode,终于你释放了它。所以你只需释放你想要保留的内存,你的列表现在只包含一堆释放内存的地址。 解决方案是,在填充列表时删除 free(),然后再释放它们

关于c - 在循环中使用 free() 从文件创建链接列表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59587312/

相关文章:

c - Doxygen:在文件级别分组数据结构

c++ - '*' token 模板化链表之前的预期构造函数、析构函数或类型转换

c++ - 链表C++实现

c - 在我的编码器中双重释放或损坏(fasttop)

c - 为什么不在这种情况下使用 free()

c - 为什么 gets() 可以正常工作,而 fgets() 却不能?

c - 使用C查找字符串中所有可能的回文

c++ - 算术运算和编译器优化

c++ - 链表和双向链表示例

c++ - 如何释放被返回的变量占用的内存(使用 C++,在类中,析构函数)?