繁体   English   中英

具有ANSI C链表的分段错误11

[英]Segmentation Fault 11 with ANSI C Linked List

更新了一些新的细节:

有趣的是,如果我不使用,则不会出现段错误: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抛出...对于列表,您具有std :: list,尽管在您的情况下std :: vector可能会更好地工作,因此您可以遍历节点数组使用非常简单的for()。

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

因此,列表永远不可能从空变大。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM