检查循环时,nullptr读取访问冲突

时间:2018-01-30 09:19:57

标签: c++ pointers nullptr

我有这段代码:

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

当我运行它时,我收到错误:

抛出异常:读取访问冲突。     current-&gt; next是nullptr。

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

3 个答案:

答案 0 :(得分:1)

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

如果current->nextnull,则在第一次迭代时会失败。 你应该交换条件检查的顺序。

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

答案 1 :(得分:0)

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

  

lhs&amp;&amp; RHS

     

对于内置逻辑AND运算符,如果两个操作数均为true,则结果为true。否则,结果为false。该运算符是短路的:如果第一个操作数为假,则不评估第二个操作数

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

答案 2 :(得分:0)

标准说[expr.log.and]

  

&amp;&amp;操作员组从左到右。操作数都是   在上下文中转换为bool(第7条)。如果两者都是如此   操作数是真的,否则是假的。不像&amp;,&amp;&amp;担保   从左到右的评估:如果是,则不评估第二个操作数   第一个操作数是假的。

所以,在

wait

首先评估第一个操作数,即current->next->data <= temp->data && current->next != nullptr 。如果current->next->data <= temp->datacurrent->next,则会出现错误。