C 中指针的奇怪行为

Strange behaviour with pointers in C

在我的 C 项目中我有这段代码(一个简单的链表):

while(current_node->v_uk <= version && current_node != NULL)
        current_node = current_node->next;

好吧,这会引发分段错误,但是,如果我将其切换为

while(TRUE){
        if(current_node->v_uk <= version && current_node != NULL)
                break;
        current_node = current_node->next;
}

它按预期工作。我无法弄清楚可能是什么问题

while 条件中语句的计算顺序是从左到右。所以 current_node->v_ukcurrent_node != NULL 检查之前被评估。

在您的第一个代码片段中交换这两个。

编辑:感谢您的评论,只是为了说清楚:逻辑与运算,根据C语言的规则,创建一个序列点,首先计算左边的参数,然后计算参数在右边。重要的是要知道并非所有表达式都保证从左到右求值,但 && 是其中之一。详情请见此处:https://en.cppreference.com/w/c/language/eval_order

两个代码片段

while(current_node->v_uk <= version && current_node != NULL)
        current_node = current_node->next;

while(TRUE){
        if(current_node->v_uk <= version && current_node != NULL)
                break;
        current_node = current_node->next;
}

调用未定义的行为,因为您试图在不知道 current_node 是否等于 NULL 的情况下访问数据成员 v_uk

在尝试访问数据成员v_uk.

之前,首先要检查current_node是否等于NULL

例如

while( current_node != NULL && current_node->v_uk <= version )
        current_node = current_node->next;

评价顺序很重要!!逻辑表达式从左到右求值

这个表达式首先取消引用指针,然后检查它是否不为 NULL。

  while(current_node->v_uk <= version && current_node != NULL)

您需要:

while(current_node != NULL && current_node->v_uk <= version)

在 C 语言中,逻辑表达式是通过简单的短路方式求值的。因此,如果 current_node 为空,则整个表达式为假,并且不会计算逻辑表达式的第二部分 - 不会取消引用 NULL 指针。