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_uk 在 current_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 指针。
在我的 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_uk 在 current_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 指针。