ANSI C链表分段故障11



更新了一些新的细节:

有趣的是,如果我不使用:node->next = NULL,如果我没有得到段错误。我可以很好地创建节点,但似乎在将初始列表头设置为新节点以及解引用->next时存在问题。

请注意,如果没有结构定义,我们就很难知道哪里出错了…

在测试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会抛出……对于list,您有std::list,尽管在您的情况下std::vector可能会更好,因此您可以使用非常简单的for()来遍历节点数组。

add_node中的newNode变量是统一的,因此它可以指向内存中的任何地方,这可能是在第二行中试图解引用它时导致段错误的原因。另外,您分配了一个新的struct节点结构,但立即覆盖了它的地址。因此,您的前几行应该重写为:

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

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

因此,列表永远不能从空开始增长

相关内容

  • 没有找到相关文章

最新更新