c++ - 具有两个不同缓冲区的指针算法
问题描述
考虑以下代码:
int* p1 = new int[100];
int* p2 = new int[100];
const ptrdiff_t ptrDiff = p1 - p2;
int* p1_42 = &(p1[42]);
int* p2_42 = p1_42 + ptrDiff;
现在,标准是否保证p2_42
指向p2[42]
? 如果不是,在 Windows、Linux 或 webassembly 堆上总是如此吗?
解决方案
添加标准报价:
当两个指针表达式
P
相Q
减时,结果的类型是实现定义的有符号整数类型;此类型应与标头 ([support.types]) 中定义的类型std::ptrdiff_t
相同<cstddef>
。
(5.1) 如果
P
和Q
都计算为空指针值,则结果为 0。(5.2) 否则,如果
P
和Q
分别指向同一数组对象的元素x[i]
和,则表达式的值为。x[j]
x
P - Q
i−j
(5.3) 否则,行为未定义。[ <em>注意:如果值
i−j
不在 type 的可表示值范围内std::ptrdiff_t
,则行为未定义。——尾注]
(5.1) 不适用,因为指针不是 nullptrs。(5.2) 不适用,因为指针不在同一个数组中。所以,我们剩下 (5.3) - UB。
推荐阅读
- python - 如何使用随机森林 ML 预测玩家
- python - Pandas 迭代两个数据帧
- android - 如何使用电容器运行 Ionic 项目?
- c++ - 声明中的 noexcept 不一致是否违反 ODR?
- angular - 角度扩展面板标题未与数据对齐
- r - tinytex 首次下载 PDF 时未找到 tabu.sty
- xml - 在两个命名空间中解组具有相同属性名称的 XML 属性
- c++ - 使用 raylib 静态库编译项目
- eclipse - XHTML 语法验证器在 Eclipse 中不可见(在 Window->Preferences 下的验证菜单选项中)
- javascript - Redux - 找不到目录来调用调度