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

为何无法初始化单链表?指针异常及段错误问题求助

单链表问题分析与修复

核心问题

你的代码中head指针始终为NULL、无输出的根本原因是C语言的参数传递是值传递:push函数里的head是main函数中head指针的副本,在push内部修改这个副本的指向(比如head = newnode)不会影响main里的原始head指针。因此无论调用多少次push,main中的head始终是NULL,display函数自然没有输出;若后续代码错误访问NULL指针的成员,则会触发段错误。

修复方案

以下两种方案均可解决问题:

方案1:传递指针的指针(推荐)

通过传递head指针的地址(即指针的指针),让push函数直接修改main中的head指针指向:

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int data;
    struct node * next;
}node;


void push(node **head,int value){
    node * newnode = (node*)malloc(sizeof(node));
    newnode->data = value;
    newnode->next = NULL;
    
    if(*head == NULL){
        *head = newnode;
        return;
    }
    
    node* iter = *head;
    while(iter->next != NULL){
        iter = iter->next;
    }
    iter->next = newnode;
}

void display(node *head){
    node *iter = head;
    while(iter != NULL){
        printf("%d->", iter->data);
        iter = iter->next;
    }
    printf("NULL\n"); // 补充链表末尾的标识
}

int main(){
    node *head = NULL;
    int size;
    scanf("%d", &size);
    
    for(int i=0; i<size; i++){
        int value;
        scanf("%d", &value);
        push(&head, value); // 传入head指针的地址
    }
    
    display(head);
}

方案2:让push函数返回更新后的head指针

修改push函数的返回值类型为node*,每次调用后用返回值更新main中的head指针:

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int data;
    struct node * next;
}node;


node* push(node *head,int value){
    node * newnode = (node*)malloc(sizeof(node));
    newnode->data = value;
    newnode->next = NULL;
    
    if(head == NULL){
        return newnode;
    }
    
    node* iter = head;
    while(iter->next != NULL){
        iter = iter->next;
    }
    iter->next = newnode;
    return head; // 链表非空时返回原head指针
}

void display(node *head){
    node *iter = head;
    while(iter != NULL){
        printf("%d->", iter->data);
        iter = iter->next;
    }
    printf("NULL\n");
}

int main(){
    node *head = NULL;
    int size;
    scanf("%d", &size);
    
    for(int i=0; i<size; i++){
        int value;
        scanf("%d", &value);
        head = push(head, value); // 用返回值更新head
    }
    
    display(head);
}

补充说明

  • 原代码中的display函数逻辑本身没有问题,只是因为main中的head一直为NULL,导致循环未执行,所以没有输出。
  • 段错误通常是由于错误访问NULL指针的成员导致的,修复指针传递问题后即可避免这类错误。

内容的提问来源于stack exchange,提问作者Harshit Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:10:19