带有ANSI C链接列表的分段故障11

时间:2014-05-28 07:25:43

标签: c linked-list segmentation-fault

更新了一些新细节:

有趣的是,如果我不使用,则不会出现段错误:node-> next = NULL。我可以很好地创建节点,但似乎将初始列表头设置为我的新节点以及解除引用 - >接下来是一个问题。

3 个答案:

答案 0 :(得分:0)

请注意,如果没有结构定义,我们就会有点难以知道错误...

在测试malloc()是否失败之前,您在使用分配的指针时遇到问题。虽然这可能不是此时的罪魁祸首。

struct node *head = (struct node*)malloc(sizeof(struct ftt_node));
foodList->head = head;      // <<<---- here using the pointer NULL or not
head->next = NULL;
rest->foods = foodList;

if (NULL == rest->foods) {       // <<<---- testing here if malloc() failed
    printf("List creation failed");
    return FALSE;
}

作为旁注,head指针存在同样的问题。

然后在add_node中你这样做,newNode从未分配过...所以可能是垃圾!

struct node *newNode;
newNode->data = newFood;

您可能想要分配newNode并使用curr查找最后一个现有节点。

这样的事情:

void add_node(POS * POS, struct food * newFood)
{
    struct node *newNode;

    struct node *newNode = (struct node*)malloc(sizeof(struct node));
    newNode->data = newFood;

    curr = POS->foods->head;

    while (curr != NULL)
    {
        curr = curr->next;
    }

    curr->next = newNode;
    newNode->next = NULL;
}

话虽这么说,我强烈建议您创建一个基本列表对象,其中包含处理列表的函数,然后使用该列表启动节点,而不是以这种方式编写。

作为旁注:您不应该在add_node()中命名变量POS。这是不好的做法,因为它会影响您的变量类型。

只是想知道,为什么不使用C ++?至少不需要测试NULL,因为如果无法分配内存,new抛出...而对于列表,你有std :: list,虽然在你的情况下std :: vector可能会更好,所以你可以通过你的节点数组非常简单的for()。

答案 1 :(得分:0)

add_node()函数永远不会修改pos->foods->head。它也从不初始化new_node,因此在不触发未定义的行为的情况下不能取消引用指针。

因此,列表永远不会变空。

答案 2 :(得分:0)

add_node中的newNode变量是单元化的,因此它可以指向内存中的任何位置,当您尝试在第二行取消引用时,这可能是segfault的原因。此外,您分配了一个新的结构节点结构,但立即覆盖了其地址。所以你的前几行应该重写:

struct node *newNode = (struct node*)malloc(sizeof(struct node));
newNode->data = newFood;
struct node *curr = POS->foods->head;