在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码


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书中关于三元运算符的章节

最新更新