更新了一些新的细节:
有趣的是,如果我不使用: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
,因此指针不能在不触发未定义行为的情况下解引用。
因此,列表永远不能从空开始增长