打印单链表分割错误

时间:2020-06-04 07:40:38

标签: c

有人可以解释为什么我会产生分段错误:11在主函数中调用display_list(head)吗?

当我使用NULL初始化列表(头)时,我没有遇到分段错误,但是我不明白为什么需要这样做,或者在这种情况下这是最佳实践。抱歉,代码混乱,我是C语言新手。

#include <stdio.h>
#include <stdlib.h> 
#define NEWLINE printf("\n");

struct element {
    int value;
    struct element * next;
};

typedef struct element listelement; 
typedef listelement * list; 

void display_list(list l) {
    if (l == NULL) printf("leer\n");
    else
    {
            while (l != NULL) {
                printf("%d ", l->value);
                l = l->next;
            }
            NEWLINE;
    }
}

int main() {

    display_list(head);
    return 0;
}

3 个答案:

答案 0 :(得分:2)

在您的insert函数中,您不需要传递list *l,因为它已经是一个指针。 另外,您的insert是函数不会更改您的head变量的值。

您可以尝试执行以下操作:

// return new head element
list insert(int v, listelement* l) {
    listelement * new; 
    new = malloc(sizeof(listelement)); 
    new->value = v; 
    new->next = l;
    return new;
}

// then in main do insert values as
int main() {
    list head;
    for (int i = 1; i <= 3; i++) {
        head = insert(i, head);
    }
    display_list(head);
    return 0;
}

答案 1 :(得分:1)

  Memory access error: dereferencing an uninitialized pointer; abort execution.
  # Reading 4 bytes from a random address (0x8199f38).
  #
  # Stack trace (most recent call first) of the read.
  # [0]  file:/prog.c::35, 17
  # [1]  file:/prog.c::54, 5
  # [2]  [libc-start-main]

这里是link来调试此段错误。只需单击“运行”。

答案 2 :(得分:1)

display_list函数依赖于listelement的next成员中具有空指针来检测何时到达列表末尾。

            while (l != NULL) {
                printf("%d ", l->value);
                l = l->next;
            }

当您将head初始化为NULL并将第一个元素添加到列表时,head的空值将存储在第一个元素的next成员中,该成员将正确终止列表中的display_list函数期望的方式。当您不将head初始化为NULL时,第一个元素的next指针包含垃圾,并且当display_list函数尝试将垃圾指针跟随到下一个元素时,您将遇到分段错误。