首页 > 解决方案 > (char *)NULL - (char *)NULL 是未定义的行为吗?

问题描述

((char *)NULL - (char *)NULL)UB吗?

IMO 的答案在这里并不简单。有什么想法吗?

用于实验的 Godbolt 链接https://godbolt.org/z/zgVGk9

附言

我不是在问关于添加空指针的东西(如在建议的欺骗中),而只是关于一种特殊情况

标签: cpointersnulllanguage-lawyerpointer-arithmetic

解决方案


该表达式具有未定义的行为。

(此问题已作为此问题的副本而关闭,但仅讨论指针+整数运算,而不是此问题所询问的指针-指针运算。如果存在特定问题,请随时将问题作为重复项关闭询问指针-指针减法。)

N1570是 2011 ISO C 标准的草案。第 6.5.6 节第 9 段,讨论减法,说:

当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。

(单个非数组对象被视为 1 元素数组的一个元素,但这不适用于此处。)

表达式产生的指针(char*)NULL不指向数组对象的元素或任何其他对象(6.3.2.3 第 3 段),因此((char *)NULL - (char *)NULL)违反了shall。违反在约束或运行时约束之外导致未定义的行为(第 4 节第 2 段)。


推荐阅读