为何无法初始化单链表?指针异常及段错误问题求助
单链表问题分析与修复
核心问题
你的代码中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
相关产品推荐
相关产品推荐

