小编典典

在 C/C++ 中检查 NULL 指针

all

在最近的一次代码审查中,一名贡献者试图强制NULL以下列方式对指针进行所有检查:

int * some_ptr;
// ...
if (some_ptr == NULL)
{
    // Handle null-pointer error
}
else
{
    // Proceed
}

代替

int * some_ptr;
// ...
if (some_ptr)
{
    // Proceed
}
else
{
    // Handle null-pointer error
}

我同意他的方式更清楚一点,因为它明确地说“确保此指针不是 NULL”,但我会反驳说,任何处理此代码的人都会理解在if语句隐式检查NULL.
另外我觉得第二种方法引入同类错误的可能性较小:

if (some_ptr = NULL)

这只是查找和调试的绝对痛苦。

你更喜欢哪种方式,为什么?


阅读 61

收藏
2022-07-28

共1个答案

小编典典

以我的经验,形式if (ptr)或测试if (!ptr)是首选。它们不依赖于符号的定义NULL。他们不会暴露意外分配的机会。它们清晰简洁。

编辑: 正如 SoapBox 在评论中指出的那样,它们与 C++
类兼容,例如auto_ptr充当指针并提供转换以bool完全启用此习惯用法的对象。对于这些对象,显式比较NULL必须调用到指针的转换,这可能具有其他语义副作用或者比bool转换所暗示的简单存在检查更昂贵。

我喜欢在没有不需要文本的情况下说明其含义的代码。if (ptr != NULL)具有相同的含义,if (ptr)但以冗余特异性为代价。下一个合乎逻辑的事情是写作if ((ptr != NULL) == TRUE),而这种方式就是疯狂。C语言很清楚,通过if,while等测试的布尔值具有特定含义,非零值是真,零是假。冗余并没有使它更清楚。

2022-07-28