不知道为什么我在这里遇到细分错误

时间:2019-06-16 17:10:58

标签: c list linked-list segmentation-fault nodes

我知道我可以更改代码来修复错误,但是我不明白为什么我会遇到细分错误。感谢所有帮助,谢谢。

typedef struct nodes{
    int data;
    struct nodes *next;
} node;

int main(int argc, char * argv[]){
    node *head = NULL;
    node *tmp = NULL;
    int i;

    head = malloc(sizeof(node));
    tmp = head;
    for(i = 0; i < 10; i++){
        tmp->data = i;
        tmp->next = malloc(sizeof(node));
        tmp = tmp->next;
    }
    tmp = NULL;
    for(tmp=head; tmp->next != NULL; tmp = tmp->next){
        printf("%d\n", tmp->data);
    }

}

这是输出:

0
1
2
3
4
5
6
7
8
9
0
Segmentation fault: 11

2 个答案:

答案 0 :(得分:3)

最后一个节点的next指针未设置为null。因此,第二个tmp->next != NULL循环中的条件for将永远不会被满足。实际上,您可以看到在出现段错误之前,在最后一个数字(0)之后打印了一些垃圾数字(9)。

执行此操作时:

tmp->next = malloc(sizeof(node));

您还应该添加以下内容:

tmp->next->next = NULL;

通过这种方式,您可以将next指针设置为NULL来“安全”地初始化每个节点。除最后一个节点外,所有节点都将在下一次迭代中获得正确的值。

由@Someprogrammerdude在注释中指出的

EDIT ,即使您执行了上面建议的操作,您最终也会在最后增加一个节点。 要解决此问题,您可以按如下所示更改创建循环:

for(i = 0; i < 10; i++){
    tmp->data = i;
    if (i < 9) {
        tmp->next = malloc(sizeof(node));
    } else {
        tmp->next = NULL;
    }
    tmp = tmp->next;
}

答案 1 :(得分:2)

通过向后构建列表,您将获得更简洁的代码。换句话说,首先将最后一个节点添加到列表中,然后在列表的开头插入其他节点。代码如下:

node *head = NULL;
for (int i = 9; i >= 0; i--)
{
    node *tmp = malloc(sizeof(node));
    tmp->data = i;
    tmp->next = head;
    head = tmp;
}

请注意,由于head最初是NULL,所以列表中的最后一个节点的next指针将设置为NULL。这就是您的代码所缺少的。