【发布时间】:2021-02-20 15:17:52
【问题描述】:
1.NULL - NULL 定义了吗?
-
(char *)NULL - (char *)NULL定义了吗? -
(uintptr_t)NULL - (uintptr_t)NULL定义了吗?
我知道它适用于我使用的所有实现。但是从标准的角度来看它是什么样子的呢?我找不到明确的答案。
编辑: 从欺骗我假设问题的一个答案是:是的。
第二个和第三个问题呢?
【问题讨论】:
-
C 标准文档
NULL被定义为一个宏扩展为实现定义的空指针常量 根据实际定义,表达式NULL - NULL可能有或没有定义的值。例如:* 如果NULL定义为#define NULL 0,那么NULL - NULL实际上是一个int类型的常量表达式,其值为0。 * 如果NULL定义为#define NULL ((void *)0),则表达式NULL - NULL是违反约束的,因为没有在void 指针上定义算术。 -
不是我,但我会添加答案中提到的内容:C18 §6.5.6.9 声明 “当减去两个指针时,两个指针都应指向指向同一个数组对象的元素,或数组对象的最后一个元素;结果是两个数组元素的下标的差异。" 但是
NULL值不指向任何对象, 并将其转换为另一种指针类型不会改变这一点。 -
投票是匿名的,这是有充分理由的。不知道为什么会有DV。
-
对不起,你得在 Meta 上问。
-
@curiousguy:我没有投反对票,但投反对票按钮的工具提示说(除其他外)“没有显示任何研究工作”。如果问题是明显重复的,那么这是拒绝投票的正当理由。此外,否决票是有意匿名的,完全取决于选民。
标签: c language-lawyer pointer-arithmetic null-pointer