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