C语言指针与链表:调用display()时程序崩溃
单链表create函数崩溃问题的排查与修复
嘿,我一眼就看出你这个create函数的问题所在了——核心是指针传递的逻辑错了,导致链表的链接完全没建立起来,后续display的时候自然会访问无效内存崩溃。咱们一步步拆解问题,再给你修复方案:
问题分析
你的create函数有三个致命问题:
- 值传递导致外部指针无法更新:函数参数是
list *start,这是把指针的副本传进函数里。你在函数里做的start=NULL或者start=(list*)malloc(...),修改的都是这个副本,外部的链表头指针根本不会被改变。比如调用create(head)后,head还是初始的NULL或者随机值,完全没指向你malloc的节点。 - 递归时传递野指针:当你创建新节点后,直接调用
create(start->right),但这时候start->right还没初始化,是个随机的野指针。递归函数里修改的只是这个野指针的副本,根本没法把新节点链接到当前节点的right上。 - 结束条件的赋值无效:输入0时
start=NULL同样只是修改了函数内部的指针副本,链表的尾节点right指针还是野指针,后续遍历的时候必然会出问题。
修复方案
给你两种常用的正确写法,选哪种都可以:
方案1:使用指针的指针(推荐)
通过传递指针的地址,让函数能直接修改外部的指针变量:
#include <stdio.h> #include <stdlib.h> typedef struct node{ int data; struct node *right; } list; void create(list **start){ int data; printf("Input value : "); scanf("%d", &data); if(data == 0){ *start = NULL; // 直接修改外部指针指向的内容 return; } else{ *start = (list*)malloc(sizeof(list)); (*start)->data = data; // 传递当前节点right指针的地址,让递归能正确设置它 create(&((*start)->right)); } } // 示例display函数(供参考) void display(list *start){ if(start == NULL) return; printf("%d ", start->data); display(start->right); } int main(){ list *head = NULL; create(&head); // 传head的地址 display(head); // 记得后续要写销毁函数释放内存,避免泄漏 return 0; }
方案2:让函数返回节点指针
这种写法更直观,通过返回值把新创建的节点链接起来:
#include <stdio.h> #include <stdlib.h> typedef struct node{ int data; struct node *right; } list; list* create(){ int data; printf("Input value : "); scanf("%d", &data); if(data == 0){ return NULL; // 尾节点的right设为NULL } else{ list *new_node = (list*)malloc(sizeof(list)); new_node->data = data; // 递归返回的节点直接赋值给当前节点的right new_node->right = create(); return new_node; } } // 示例display函数 void display(list *start){ if(start == NULL) return; printf("%d ", start->data); display(start->right); } int main(){ list *head = create(); // 直接接收返回的头节点 display(head); // 记得释放内存 return 0; }
额外提醒
不管用哪种写法,记得在程序结束前写一个销毁链表的函数,逐个free每个节点,避免内存泄漏哦!
内容的提问来源于stack exchange,提问作者anmoloo7
相关产品推荐
相关产品推荐

