C语言打印双向链表陷入无限循环问题排查
双向链表代码打印后陷入无限循环的原因分析
你的代码能输出正确数据,但程序会陷入无限循环,问题出在链表结构体的初始化环节:
在main函数中,你通过malloc分配了list类型的内存:
list *L1=(list *)malloc(sizeof(list));
但malloc仅负责分配内存空间,不会自动初始化内存内容,因此L1->head会是一个随机的野指针(垃圾值),而非预期的NULL。
具体影响:
- 第一次调用
insert函数时,isEmpty判断L->head == NULL会不成立(因为L->head是野指针),进而执行else分支:
这里对野指针L->head->prev = N; N->next = L->head; L->head = N;L->head的prev字段赋值,属于未定义行为——虽然最终打印出了正确的节点顺序,但内存中已经留下了错误的指针连接。 - 程序打印完成后,错误的指针引用会导致后续运行时出现异常,表现为无限循环。
修复方案:
有两种简单的修复方式:
- 方式一:分配链表内存后,手动将
head置为NULL:list *L1=(list *)malloc(sizeof(list)); L1->head = NULL; // 新增初始化代码 - 方式二:使用
calloc代替malloc,calloc会自动将分配的内存初始化为0(对应指针的NULL):list *L1=(list *)calloc(1, sizeof(list));
修复后,第一次insert时isEmpty会正确识别链表为空,执行正确的分支逻辑,链表的指针连接完全正常,程序不会再出现无限循环。
内容的提问来源于stack exchange,提问作者yourdad
相关产品推荐
相关产品推荐

