C语言单链表程序编译通过但运行异常,求bug排查帮助
单链表代码运行异常的问题分析与修复
核心问题1:InitNode函数参数传递错误
C语言函数参数是值传递,你在InitNode里给形参n分配内存,但这个修改不会同步到外部的p变量。外部的p始终是NULL,后续访问p->data会直接触发内存访问错误。
修复方法:让InitNode返回分配好的节点指针,更直观易懂:
node* InitNode(){ node *n = malloc(sizeof(node)); if(n == NULL){ // 必须检查内存分配是否成功 return NULL; } n->data = 9999; n->next = NULL; return n; }
对应CreateListOnL里的调用修改为:
node *p = InitNode(); if(!p){ puts("fail"); exit(EXIT_FAILURE); }
核心问题2:遍历链表的逻辑错误
- 原代码遍历循环中没有移动
p指针,会导致无限循环(链表非空时);若链表为空(初始输入9999),p为NULL,访问p->next会直接崩溃。 - 需要先判断链表是否为空,遍历过程中每次循环要让
p指向下一个节点。
修复后的遍历代码:
int i=1; if(p == NULL){ // 处理空链表情况 puts("链表为空"); return 0; } while (p != NULL) // 遍历所有节点直到p为NULL { printf("linked-list %d:%d\n", i, p->data); i++; p = p->next; // 移动指针到下一个节点 }
其他细节优化
malloc的返回值无需强制转换(C标准中不需要,强制转换可能隐藏类型匹配问题),直接写node *n = malloc(sizeof(node));即可。- 可以在
main函数末尾添加return 0;,符合C语言规范。
完整修复后的代码
#include <stdio.h> #include <stdlib.h> typedef int Datatype; typedef struct singlyLinkedList { Datatype data; struct singlyLinkedList *next; }node; typedef node *linkList; node* InitNode(){ node *n = malloc(sizeof(node)); if(n == NULL){ return NULL; } n->data = 9999; n->next = NULL; return n; } linkList CreateListOnL(void){ int value; linkList head=NULL; puts("if input 9999 then end"); puts("input, please:"); scanf("%d",&value); while (value!=9999) { node *p = InitNode(); if(!p){ puts("fail"); exit(EXIT_FAILURE); } p->data=value; p->next=head; head=p; puts("input the value, please:"); scanf("%d",&value); } return head; } int main(void){ linkList L = CreateListOnL(); node *p = L; int i=1; if(p == NULL){ puts("链表为空"); return 0; } while (p != NULL) { printf("linked-list %d:%d\n",i,p->data); i++; p = p->next; } return 0; }
内容的提问来源于stack exchange,提问作者shucha li
相关产品推荐
相关产品推荐

