我想知道是否总是会编译以下代码,以便没有非法的NULL ptr解引用?
我担心的是编译器在第一次检查“b”是否为NULL之前可能会检查b->值。
typedef struct
{
int value;
} mystruct;
int func(mystruct * b)
{
if((NULL == b) || (b->value == 0))
{
return -1;
}
printf("value: %d\n", b->value);
}
答案 0 :(得分:2)
如果b
为NULL
,则(NULL != b)
为 false ,则会检查第二方。 (参见Short-Circuit evaluation)你可能会得到NULL ptr dereferences。
将||
更改为&&
答案 1 :(得分:2)
是的,(NULL != b)
将在(b->value == 0)
之前进行测试。
您所做的是Short-Circuit Evaluation。
答案 2 :(得分:0)
您不必担心,除非第一个条件尚未确定结果,否则不会执行第二个条件。