正如comp.lang.c FAQ所说,有些体系 struct 中的空指针并不全是0位.因此,问题是什么实际上判断了以下 struct :

void* p = get_some_pointer();
if (!p)
    return;

我是将p与机器相关的空指针进行比较,还是将p与算术零进行比较?

我应该写信给你吗?

void* p = get_some_pointer();
if (NULL == p)
    return;

而是为这样的架构做好准备,还是这只是我的妄想?

推荐答案

根据C规范:

值为0的整型常量表达式或此类表达式

所以0是一个空指针常量.如果我们将其转换为指针类型,我们将得到一个空指针,对于某些体系 struct ,它可能不是所有位零.接下来,让我们看看规范中关于比较指针和空指针常量的说明:

如果一个操作数是

让我们考虑(p == 0):首先将0转换为空指针,然后将p与其实际位值依赖于体系 struct 的空指针常量进行比较.

接下来,看看规范对否定操作符有什么规定:

逻辑求反运算符的结果!如果其

这意味着(!p)相当于(p == 0),根据规范,这是根据机器定义的空指针常数测试p.

因此,即使在NULL指针常量不是全位零的体系 struct 上,也可以安全地写入if (!p).

对于C++,空指针常量定义为:

空指针常量是整型常量表达式(5.19)

这接近于C,加上nullptr个语法.操作员==的行为定义如下:

此外,可以比较指向成员的指针或指向

这将导致将0转换为指针类型(如C).对于否定运算符:

逻辑求反运算符的操作数!这是语境

这意味着!p的结果取决于如何执行从指针到bool的转换.标准说:

可以使用零值、空指针值或空成员指针值

因此,if (p==NULL)if (!p)也在C++中做同样的事情.

C++相关问答推荐

ATTiny1606定时器TCA 0中断未触发

为什么输出不是从上到下C

为什么在C中二维字符数组会有这样的行为?

以下声明和定义之间的区别

ifdef __cplusplus中的整数文字单引号

在C++中父进程和子进程中的TAILQ队列同步问题

处理来自浏览器的HTTP请求

通过k&;r语法的c声明无效

生产者消费者计数器意外输出的C代码

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

向左移位3如何得到以字节为单位的位数?

C:面筋蛋白';为什么不刷新窗口?

如果类型是新的,offsetof是否与typeof一起工作?

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

使用 _Atomic float 时,MSVC 编译的代码会命中调试断言

Linux memcpy 限制关键字语法

React Native Android C++ TurboModules 静态 C 库链接问题

为什么我的条件不起作用?使用 fgets 输出

在 C 语言中,为什么 10/3 应该给出 3.333 却给出 3.000? (保存 10 和 3 的变量被声明为double)

在 atmega4809 上使用 UART1 发送多个字符会导致发送 0xFF