You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指向不同数组的同类型指针相减,结果是否具备实际意义?

指针减法:跨数组指针相减的结果是否有意义?

这是个有点傻但很有趣的问题。我在研究指针与内存对齐时,好奇是否可以对指向不同数组元素的两个指针执行减法操作。

指针相减通常应得到表示数组中两个元素间元素个数的值。例如以下有效代码的运行结果符合预期:

unsigned short *p_short = new unsigned short[100];
unsigned short *p_1 = &p_short[10];
unsigned short *p_2 = &p_short[20];

std::cout << p_2 - p_1 << std::endl;
// 输出应为 `10`
// 两个指针之间间隔10个unsigned short元素
// 注意:不是`20`,指针减法计算的不是字节数差
  • 若数组类型不同,则无法进行此操作,会触发类型错误。
  • 若指针类型相同但指向不同数组的元素,则可以执行减法操作。

但在后一种情况下,相减的结果是否具备实际意义?

以下是一个无法得到有意义结果的示例:

auto p1 = new unsigned short[100];
auto p2 = new unsigned short[100];
std::cout << p2 - p1 << std::endl;

输出可能是104,也可能是像-6148914691236517216这类完全随机的数值。

从C++标准的定义来看,只有当两个指针指向同一个数组(或数组的尾后指针)时,指针相减的操作才是合法且结果可预测的。跨不同数组的指针相减属于未定义行为——编译器可以生成任意结果,这些数值没有任何逻辑上的实际意义,完全依赖于内存分配的随机位置。

出现这类奇怪结果的原因,是编译器直接计算了两个指针地址的字节差,再除以指针类型的大小(比如unsigned short占2字节,地址差除以2)。但两个独立数组的内存地址由分配器随机分配,地址差本身没有规律,最终结果自然毫无意义。

内容的提问来源于stack exchange,提问作者user2138149

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:52:10