分段错误:尝试打印链接列表时为11

时间:2019-08-03 23:00:40

标签: c pointers null segmentation-fault

我对C还是很陌生,我知道指针可能做错了什么,但我似乎无法查明我做错了什么。

以下是链表的结构和功能:

// node structure
struct Node {
    int val;
    struct Node* next;
};

// singly linked list structure
struct LinkedList {
    int size;
    struct Node* head;
} LinkedList = {0, NULL};


// insert at head function
void InsertHead(struct LinkedList* list, int val) {
    struct Node* node = malloc(sizeof(struct Node));
    node->val = val;
    node->next = list->head;
    list->head = node;
    list->size++;
}

// print values in list
void PrintList(struct LinkedList* list) {
    struct Node* node = list->head;

    while (node != NULL) {
        printf("%d, ", node->val);
        node = node->next;
    }
    printf("\n");
}

当我尝试使用以下代码调用 PrintList 时:

// main function
int main() {
    struct LinkedList* mylist = malloc(sizeof(LinkedList));
    InsertHead(mylist, 4);
    InsertHead(mylist, 3);
    InsertHead(mylist, 1);

    // printf("%d, ", mylist->head->val);
    // printf("%d, ", mylist->head->next->val);
    // printf("%d, ", mylist->head->next->next->val);
    // printf("\n");
    PrintList(mylist);

    return 0;
}

我收到错误Segmentation fault: 11

当我运行时,删除对PrintList函数的调用并取消注释printf语句,我得到所需的输出:

1,3,4,

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

您永远不会初始化在struct LinkedList顶部分配的main()

因此,当您遍历列表进行打印时,在您明确插入三个元素之后,最后一个元素的next字段将包含原始head字段中的任何垃圾LinkedList分配时。

要解决此问题,您可以改为使用calloc分配它(在分配给您的内存之前将其分配的内存显式清零),或编写一个同时分配的辅助函数。显式初始化struct LinkedList