我对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,
我在这里想念什么?
答案 0 :(得分:1)
您永远不会初始化在struct LinkedList
顶部分配的main()
。
因此,当您遍历列表进行打印时,在您明确插入三个元素之后,最后一个元素的next
字段将包含原始head
字段中的任何垃圾LinkedList
分配时。
要解决此问题,您可以改为使用calloc
分配它(在分配给您的内存之前将其分配的内存显式清零),或编写一个同时分配和的辅助函数。显式初始化struct LinkedList
。