c语言 - 分段错误:尝试打印链表时出现 11



我对 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,

我在这里错过了什么?

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

因此,当您浏览列表以打印它时,在您明确插入的三个元素之后,最后一个元素的next字段将包含分配原始LinkedListhead字段中的任何垃圾。

要解决此问题,您可以使用calloc来分配它(这会明确地将分配给您的分配内存清零),或者编写一个帮助程序函数来分配显式初始化struct LinkedList

相关内容

  • 没有找到相关文章

最新更新