我对 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
字段将包含分配原始LinkedList
head
字段中的任何垃圾。
要解决此问题,您可以使用calloc
来分配它(这会明确地将分配给您的分配内存清零),或者编写一个帮助程序函数来分配和显式初始化struct LinkedList
。