考虑以下代码:
char* p = new char[2];
long* pi = (long*) p;
assert(p == pi); // OK
char* p1 = &p[1];
long* pi1 = (long*) p1;
assert(p1 == pi1); // OK
int d = p1 - p;
int d1 = pi1 - pi;
assert(d == d1); // No :(
运行后,我得到 d == 1
和 d1 == 0
,尽管 p1 == pi1
和 p == pi
(我在调试器中检查过)。这是未定义的行为吗?
最佳答案
正如其他人所指出的,这是未定义的行为。但是,对于您所看到的内容,有一个非常简单的解释。
指针之间的区别在于元素的个数,而不是它们之间的字节数。
pi和pi1都指向long,但是pi1指向的地址只比pi多了一个字节。假设 long 的长度为 4 个字节,地址差 1 除以元素大小 4 为 0。
另一种思考方式是,您可以想象编译器会生成与此等效的代码来计算 d1:
int d1 = ((BYTE*)pi1 - (BYTE*)pi)/sizeof(long).
关于c++ - 为什么这两个指针减法给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9185171/