c++ - 为什么这两个指针减法给出不同的结果?

标签 c++

考虑以下代码:

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 == 1d1 == 0,尽管 p1 == pi1p == 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/

相关文章:

c++ - MFC 打开文件位置并选择(突出显示)文件

c++ - 如何访问从参数传递的*fcmp

c++ - 如何为 std::list 重载 std::remove ?

c++ - 如何使用多个版本的 GCC

c++ - 不同类的链表,如何用指针访问具体的类函数?

c++ - 使用可变参数模板将 vector 中的参数应用于函数时出现奇怪错误

c++ - 返回对类的引用

c++ - 在 std::list<Shape*>::iterator 的指针上调用函数

c++ - 两次递归调用的递归算法的时间复杂度

c++ - Variadic 模板类,从其参数列表中获取特定类型的索引