C语言 在循环中使用 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

我该怎么办?

除了编译本文时会得到的所有这些警告。我只想告诉你,你误解了malloc()free()和指针是如何工作的。

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

在你的程序中,你malloc()获取你的内存,将内存地址设置为newNode,然后你告诉你的列表保存newNode,最后你释放它。所以你只是释放你想要保留的内存,你的列表现在只保存一堆地址来释放内存。 解决方案是,在填充列表时摆脱free(),稍后释放它们

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

请考虑将名称扩展到适当的大小,或使用动态分配 (malloc( 作为名称。

相关内容

  • 没有找到相关文章

最新更新