签入循环时违反 nullptr 读取访问冲突



我有这个代码:

while (current->next->data <= temp->data && current->next != nullptr)
        {
            current = current->next;
        }

当我运行它时,出现错误:

引发异常:读取访问冲突。 当前>下一个是NullPTR。

我相信我不应该收到此错误,因为它是我检查的确切内容;我是新手,我做错了什么吗?

while (current->next->data <= temp->data && current->next != nullptr)

如果null current->next,这将在第一次迭代中失败。您应该交换条件检查的顺序。

while (current->next != nullptr && current->next->data <= temp->data)

http://en.cppreference.com/w/cpp/language/operator_logical

LHS && RHS

对于内置逻辑 AND 运算符,如果两个操作数都为 true,则结果为 true。否则,结果为 false。此运算符短路:如果第一个操作数为假,则不计算第二个操作数

lhs表达式将首先执行,因此您应该将current->next空指针检查放在&&的左侧。

Standard 说 [expr.log.and]

&

&运算符从左到右分组。操作数都是 上下文转换为布尔值(第 7 条(。如果两者兼而有之,则结果为 true 否则操作数为真,为假。与 &、&& 保证不同 从左到右计算:如果 第一个操作数为假。

所以,在

current->next->data <= temp->data && current->next != nullptr

首先计算第一个操作数,即current->next->data <= temp->data 。如果current->next nullptr,则在这里出现错误.

最新更新