循环判断时触发nullptr读取访问违规,为何检查仍报错?
问题分析与修复方案
嘿,我一眼就看出问题啦——你把while循环里的条件判断顺序搞反了,这才导致了空指针访问错误!
咱们来拆解一下:C++里的&&运算符是短路求值的,意思是只有左边的表达式为真的时候,才会去计算右边的表达式。你现在写的是:
while (current->next->data <= temp->data && current->next != nullptr)
程序会先尝试访问current->next->data,但如果这时候current->next已经是nullptr了,你去访问它的data成员,就相当于去摸一个不存在的东西,肯定会触发内存访问违规啊!后面的current->next != nullptr判断根本没机会执行,因为前面已经崩了。
打个简单的比方:你想确认“邻居家的孩子年龄比我家的小,而且邻居家有孩子”,你总不能先去问邻居家孩子的年龄(万一邻居家根本没孩子呢?),得先确认邻居家有孩子,再去问年龄对吧?
所以正确的做法是把条件顺序反过来,先检查指针是否有效,再访问它的成员:
while (current->next != nullptr && current->next->data <= temp->data) { current = current->next; }
这样一来,程序会先判断current->next是不是nullptr,如果是,直接跳过右边的判断,循环终止;如果不是,再去比较data的值,完全避免了空指针访问的问题。
内容的提问来源于stack exchange,提问作者dustin smith
相关产品推荐
相关产品推荐

