c - (char *)NULL - (char *)NULL 是未定义的行为吗?
问题描述
是((char *)NULL - (char *)NULL)
UB吗?
IMO 的答案在这里并不简单。有什么想法吗?
用于实验的 Godbolt 链接https://godbolt.org/z/zgVGk9
附言
我不是在问关于添加空指针的东西(如在建议的欺骗中),而只是关于一种特殊情况。
解决方案
该表达式具有未定义的行为。
(此问题已作为此问题的副本而关闭,但仅讨论指针+整数运算,而不是此问题所询问的指针-指针运算。如果存在特定问题,请随时将问题作为重复项关闭询问指针-指针减法。)
N1570是 2011 ISO C 标准的草案。第 6.5.6 节第 9 段,讨论减法,说:
当两个指针相减时,都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。
(单个非数组对象被视为 1 元素数组的一个元素,但这不适用于此处。)
表达式产生的指针(char*)NULL
不指向数组对象的元素或任何其他对象(6.3.2.3 第 3 段),因此((char *)NULL - (char *)NULL)
违反了shall。违反应在约束或运行时约束之外导致未定义的行为(第 4 节第 2 段)。
推荐阅读
- generics - 是否可以根据父函数参数推断高阶函数接收器类型?
- r - 在 debian 上更新 R——/etc/apt/sources.list 的正确形式
- r - 比较一个数据框中多行中的一个值与第二个数据框中多行中的值
- r - 管道中的map2()函数
- php - Eloquent ORM 连接参数的意外 var_dump
- php - 如何在 Symfony 的控制器中获取搜索查询的总数
- django - 按钮在注册表单中不起作用
- php - WordPress 自定义主题,PHP 问题
- c# - 为什么我的简单转向论点由于某种原因不会响应?(2D)
- jenkins - 如何配置 Jenkins 性能插件以使具有相对错误阈值的作业失败