C语言链表头部插入打印程序崩溃问题排查
问题分析与错误定位
错误码3221225477对应Windows系统的0xC0000005异常,也就是非法内存访问(段错误),根源是你修改后的Print函数中,do-while循环的执行逻辑导致了对NULL指针成员的访问。
核心原因:do-while与while的执行逻辑差异
原程序的Print函数使用while循环,是先判断指针有效性,再执行循环体,能避免访问NULL指针:
void Print(Node *head) { Node *p = head; // 先检查p是否非空,再执行打印 while (p != NULL) { printf("%d ", p->data); p = p->next; } }
而do-while循环是先执行一次循环体,再判断条件,如果循环体或条件判断中处理不当,就会触发非法访问。
Print函数的典型错误场景
结合你的描述(输入第一个元素打印后崩溃),最可能的错误是以下情况:
你错误地将循环条件写成了while(p->next != NULL)而非while(p != NULL),比如:
void Print(Node *head) { Node *p = head; do { printf("%d ", p->data); p = p->next; } while (p->next != NULL); // 错误:当p为NULL时,访问p->next触发崩溃 }
当链表只有第一个节点时:
- 第一次执行循环体:打印节点数据,
p被赋值为该节点的next(也就是NULL) - 进入条件判断:尝试访问
NULL->next,直接触发非法内存访问,程序崩溃。
修正方案
调整do-while循环的逻辑,确保不会访问NULL指针:
void Print(Node *head) { if (head == NULL) { // 先处理空链表,避免进入循环 return; } Node *p = head; do { printf("%d ", p->data); p = p->next; } while (p != NULL); // 条件判断p是否非空,而非p->next }
内容的提问来源于stack exchange,提问作者saul_foodman
相关产品推荐
相关产品推荐

