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
我应该怎么办?
解决方案
该sAirport
结构将名称定义为一个字符。但是,从代码来看,似乎createNode
将允许长名称(最多 999 个字符)。当createNode
创建新条目时,strcpy 将覆盖超出分配空间的数据,并可能导致分段错误或“有趣”数据。
考虑将 name 扩展到适当的大小,或对 name 使用动态分配 (malloc)。
推荐阅读
- maven - 通过 Jenkins 从子 pom 中读取 pom 信息
- python - 创建函数 Microsoft SQL Server
- django - POST 方法不向基于 Django 函数的视图发送数据
- c# - 如何在reactjs中的C#中将查询结果的值存储在2个不同的变量中
- reactjs - 如何在 pdf 中转换文件并在 react native 中下载
- security - 有没有办法使用 GraphQL 从 GitHub 安全公告数据库中提取特定存储库的安全公告?
- jenkins - 在 Jenkins 的框中将活动的选定参数显示为逗号分隔值
- javascript - 为什么特定的 cookie 总是返回 undefined?
- python - 打开 chrome webdriver 后 Python 脚本崩溃
- c# - 元组
与 GroupBy