You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:26:16