据我所知,在C中,
● A value of zero represents false.
● Any nonzero value represents true.
在以下代码中
void *counting_thread(void *c)
{
int i, *j;
if(c) j = c;
else j = &i;
....
}
我无法理解如何在if条件中评估void指针。如何在以下两种情况下评估if条件?
If c is a null pointer
If c is not a null pointer
答案 0 :(得分:3)
在布尔上下文中计算的任何指针(对象指针,函数指针,void指针)如果为空则为false
,否则为true
。
答案 1 :(得分:1)
我认为C99标准中的以下引用会阻止你。
6.3.1.2布尔类型
1当任何标量值转换为_Bool时,如果是,则结果为0 值比较等于0;否则,结果是1.59
6.8.4.1 if语句约束
1 if语句的控制表达式应具有标量 类型。
2在两种形式中,如果表达式,则执行第一个子语句 比较不等于0。
所以在这个陈述中
if(c) j = c;
检查类型void *
的指针c是否包含0或某些非零值。
考虑以下计划
#include <stdio.h>
int main( void )
{
void *p;
int x = 10;
p = NULL;
if ( p ) puts( "p is not equal to 0" );
else puts( "p is equal to 0" );
p = &x;
if ( p ) puts( "p is not equal to 0" );
else puts( "p is equal to 0" );
return 0;
}
输出
p is equal to 0
p is not equal to 0
答案 2 :(得分:0)
正如Kerrek SB所写,空指针的计算结果为false,所有其他指针的结果为true。因此,如果c
是空指针,则会为j
分配局部变量i
的地址。如果c
不是空指针,则j
将指向内存c
指向。
此类构造的意图很可能为稍后的某些代码提供有效的指针,该代码需要有效int *
来写入,counting_thread
的调用方可能提供也可能没有提供