【发布时间】:2026-01-02 02:15:02
【问题描述】:
我正在尝试为用户输入的“打印作业”创建优先级队列。输入一个字符串,后跟一个空格,然后输入一个数字 (0-9) 作为作业的优先级。一旦输入“NONE”,程序就会停止输入,我最终将编写代码以按优先级顺序打印出作业。该代码尚未完成,但已经导致分段错误。我盯着代码看了大约两个小时,没有发现任何问题。我也找不到任何可以从中找出问题的问题。我假设我只是在做一些愚蠢的事情并且看不到它。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
int priority;
char *dataString;
struct node *next;
};
struct node *first = NULL;
int main(void)
{
char temporaryPriority;
int i = 0;
while(i != 1)
{
struct node *newNode = malloc(sizeof(struct node));
if (newNode == NULL)
{
exit(EXIT_FAILURE);
}
scanf("%s", (newNode -> dataString));
if ((strcmp((newNode -> dataString), "NONE") != 0) && (strcmp((newNode -> dataString), "none") != 0))
{
scanf(" %c", &temporaryPriority);
(newNode -> priority) = temporaryPriority;
(newNode -> next) = first;
first = newNode;
}
else
{
i = 1;
free(newNode);
}
}
return 0;
}
【问题讨论】:
-
盯着代码看通常是徒劳的。两个小时后它看起来和你开始时一样。然而,使用调试器通常非常有用,就像 valgrind 之类的内存分析工具一样。只需添加 printf() 语句来跟踪代码的进度,就可以在 2 小时之前发现问题区域。在您具备一些基本的调试技能并愿意自己使用它们之前,请停止编写程序。
-
显然,您已经学习了三个月的 CS 课程。请告诉您的教授/助教指导他们的学生立即进行故障排除和调试,然后再发布更多无意义、浪费时间的作业。
-
@MartinJames 我目前无法访问调试器,因为我需要在仅安装了 GCC 的服务器上进行编程。我正在使用 printf 语句并注释掉代码部分以试图找出问题所在。你在上面看到的实际上是一个重写的版本,我认为它可以清除我没有看到的任何错误。我还没有学到任何关于调试的知识,并且正在考虑从 gdb 开始,但我也会研究 valgrind。谢谢你的建议。
标签: c linked-list segmentation-fault nodes