long cread(long *xp) {
return (xp? *xp : 0);
}
它是无效的,因为它可能会尝试从空地址读取
所以解决方案建议了这段代码
long cread_alt(long *xp){
long tem = 0;
if(*xp > 0){
tem = *xp;
}
return tem;
但我认为它也是无效的,因为当xp
指向空地址时if(*xp > 0)
仍然是有缺陷的。
所以我认为这段代码
long cread_alt2(long *xp){
long tem = 0;
if(xp != NULL){
tem = *xp;
}
return tem;
}
我说的对吗?
long cread(long *xp) {
return (xp? *xp : 0);
}
是有效的,这是一种非常常见的技术。 表达式pointer_name
可以转换为bool
,如果pointer_name == nullptr
,则false
,如果pointer_name != nullptr
,则true
。 这意味着对于上面的代码,仅当您没有空指针时才*xp
发生。
int cread_alt2(long *xp){
long tem = 0;
if(xp != NULL){
tem = *xp;
}
return tem;
}
做同样的事情,只是它更冗长。 因此,唯一实际无效的代码是cread_alt
,它确实取消引用xp
,而无需首先检查它是否为 null。
使用
if(xp != NULL){
tem = *xp;
}
有效。但是,在第二个代码段中,您有
if(*xp > 0){
tem = *xp;
}
也许您想同时使用两者。
if ( xp != NULL && *xp > 0 )
{
tem = *xp;
}
如果您能够使用 C++11 或更高版本,则最好使用nullptr
而不是NULL
进行编码。
if ( xp != nullptr && *xp > 0 )
{
tem = *xp;
}
原始函数是 100% 有效的代码,它永远不会取消引用 NULL 指针。
我认为你应该阅读你最喜欢的C书中关于三元运算符的章节