C++链表打印时触发空指针运行时错误的问题咨询
C++链表打印时触发空指针运行时错误的问题咨询
嗨,我来帮你拆解一下这个问题的根源~
首先来看你能正常运行的那段循环代码:
while (head!= NULL) { cout << head->data; head= head->next; }
这段代码的核心安全点在于每次访问head->data之前,都先做了head != NULL的检查——只有当head不是空指针的时候,才会执行打印和移动指针的操作。哪怕链表是空的(head一开始就是NULL),或者遍历到最后一个节点之后,循环都会及时终止,不会去碰空指针的成员。
而你手动写的这段代码就没有做这种安全检查:
cout << head->data; head= head->next; cout << head->data << endl;
问题出在:如果你的链表节点数量小于2(比如只有1个节点,甚至是空链表),第一次执行head = head->next之后,head就会变成NULL。这时候你再去执行cout << head->data,就相当于对一个空指针进行解引用操作,这在C++里是未定义行为,直接触发了LeetCode的UndefinedBehaviorSanitizer报错——也就是你看到的那个运行时错误。
举个具体的例子:假设你的链表只有一个节点[10],第一次打印10后,head被赋值为这个节点的next(也就是NULL),接下来你试图访问NULL->data,这就直接踩了空指针的坑。
如果一定要手动打印而不用循环,那每次访问head之前都必须加判空检查,比如改成这样:
if (head != nullptr) { cout << head->data; head = head->next; if (head != nullptr) { cout << head->data << endl; } }
不过更推荐你用一开始的循环写法,它能适配任意长度的链表(空链表、1个节点、N个节点都能安全处理),不用每次都手动加一堆判断,代码也更简洁健壮。
内容来源于stack exchange
相关产品推荐
相关产品推荐

