【问题标题】:Segmentation fault help for linked list newbie in CC中链表新手的分段错误帮助
【发布时间】: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


【解决方案1】:

请将char *dataString;修改为char dataString[50];50只是一个假数字,你可以根据你的职业定义。

原因是你做了scanf("%s", (newNode -&gt; dataString));,但是你没有为newNode -&gt; dataString分配内存。

第二种方式: 为节点分配内存:

struct node *newNode = malloc(sizeof(struct node));
newNode->dataString  = malloc(sizeof(char) * 20);

为节点释放内存:

free(newNode->dataString);
free(newNode);

【讨论】:

  • 感谢您向我指出这一点。有没有办法在节点中为 dataString[] 动态分配内存?
  • @Glace 是的,但是您已经知道这一点,因为您已经错误分配了节点本身,所以,我不明白您为什么要问如何为 dataString[] 分配内存?
  • ..尤其是因为您已经参加了至少 3 个月的 CS 课程。