指向不同数组的同类型指针相减,结果是否具备实际意义?
指针减法:跨数组指针相减的结果是否有意义?
这是个有点傻但很有趣的问题。我在研究指针与内存对齐时,好奇是否可以对指向不同数组元素的两个指针执行减法操作。
指针相减通常应得到表示数组中两个元素间元素个数的值。例如以下有效代码的运行结果符合预期:
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
相关产品推荐
相关产品推荐

