迭代LinkedList时的SegFault

时间:2017-10-29 17:40:08

标签: c segmentation-fault

我是C编程的新手,我尝试创建一个SingleLinkedList。我在迭代列表时遇到了问题,但我不知道为什么。

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

struct node {
    int val;
};

struct entry {
    struct entry *next;
    struct node node;
};

struct list_head {
    struct entry *next;
};


/* Insert new element in the beginning of the list */
void list_add(struct list_head *list, struct entry *new)
{
    if(list == NULL)
    {
        printf("%s", "Please make sure your head isn't NULL!");

        return;
    }
    else
    {
        new->next = list->next;
        list->next = new;
    }
}


/* Check, whether entry is the last entry of the list */
bool list_is_last(struct entry *entry)
{
    if(entry->next == NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}

void print_list(struct list_head *list)
{
    if(list == NULL)
    {
        printf("%s", "Please make sure your head isn't NULL!");

        return;
    }

    if(list->next != NULL)
    {
        struct entry* current;

        current = list->next;

        while(!list_is_last(current))
        {
            printf("%i \n", current->node.val);

            current = current->next;
        }
    }
    else
    {
        return;
    }
}

int main()
{
    struct list_head* head;
    head = malloc(sizeof(struct list_head));
    head->next == NULL;

    int i;
    for(i = 0; i < 10; i++)
    {
        struct entry* e = malloc(sizeof(struct entry));

        e->node.val = i + 1;
        e->next = NULL;

        list_add(head, e);
    }

    print_list(head);

    return 0;
}

在访问列表的最后一项时,我总是在list_is_last方法中获得SegmentationFault。我实际上并没有理解为什么,因为在我看来,他不应该进入&#34;最后&#34;迭代,因为指针&#34; next&#34;最后一个变量应为NULL。

如果有人可以帮助我,我会很高兴。

1 个答案:

答案 0 :(得分:0)

布尔最后一个节点检查应该是(这可以让你打印列表的最后一个节点)。

    if( entry == NULL )
    {
        return true;
    }
    else
    {
        return false;
    }

此外,您应该在null旁边指定head-&gt;的值。 head->next=NULL

您的代码中几乎没有:

  • 不要忘记free已分配的内容。

  • 您应该检查malloc的返回值。例如: -

    struct list_head * head; head = malloc(sizeof(struct list_head)); if(head == NULL){    fprintf(stderr,“%s”,“malloc中的错误”);    出口(1); }

  • 您应该包含stdlib.h来运行此代码。 (malloc等)。

很高兴: -

您也可以采取一些措施使您的代码更具可读性: -

  • 选择适当的变量名称。它可以帮助您长期维护代码。

  • 尝试编译代码并查找可能的错误和警告消息。

  • 有时也会干掉代码,以便在代码中出现小错误。

最重要的问题“为什么会发生段错误?”?

原因是你首先要分配head-next == NULL。这基本上只是一个比较,head->next的值不会改变。

head->next包含垃圾值。

现在您认为已将其分配给NULL,但您没有使用==代替=

现在,如果您从链接列表中的节点插入逻辑中思考,您将看到在列表头中添加值为1,2,3,4...10的节点。

因此,在插入所有内容10->9->..._.2->1->(X)之后,列表就会变为。

您认为(X)= NULL但实际上它是垃圾值。

现在你开始打印了。

你做得很好,然后你去了最后一个节点1。然后,您检查了next NULL是否为1,当然不是这种情况,因此您打印NULL然后您现在正在entry==NULL取消引用一些垃圾值。 ..从这一点开始,它是未定义的行为。而且你的程序可能会打印垃圾值并爆炸或者只是炸掉。

发生了什么事。

另外,为什么需要将逻辑更改为RewriteEngine On RewriteCond %{QUERY_STRING} ^(.*)lang=en&(.+)$ RewriteRule ^(.*)$ /$1?%1%2&lang=en ...你会明白,如果你用纸画图像并思考。我将把它留作作业。