首页 > 解决方案 > 具有两个不同缓冲区的指针算法

问题描述

考虑以下代码:

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 堆上总是如此吗?

标签: c++pointerslanguage-lawyerpointer-arithmetic

解决方案


添加标准报价:

expr.add#5

当两个指针表达式PQ减时,结果的类型是实现定义的有符号整数类型;此类型应与标头 ([support.types]) 中定义的类型std::ptrdiff_­t相同<cstddef>

  • (5.1) 如果PQ都计算为空指针值,则结果为 0。

  • (5.2) 否则,如果PQ分别指向同一数组对象的元素x[i]和,则表达式的值为。x[j]xP - Qi−j

  • (5.3) 否则,行为未定义。[ <em>注意:如果值i−j不在 type 的可表示值范围内std::ptrdiff_­t,则行为未定义。——尾注]

(5.1) 不适用,因为指针不是 nullptrs。(5.2) 不适用,因为指针不在同一个数组中。所以,我们剩下 (5.3) - UB。


推荐阅读