为什么这两个指针相减会得到不同的结果
Why do these two pointer subtractions give different results?
考虑以下代码:
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多一个字节。假定长为4字节长,则地址1除以元素大小4的差值为0。
另一种思考方式是,你可以想象编译器会生成与此等效的代码来计算d1:
int d1 = ((BYTE*)pi1 - (BYTE*)pi)/sizeof(long).
如果指针不指向同一个数组,或者指针是从指针类型转换为不相关的类型,则两个指针之间的差异是未定义的。
此外,差异不在于字节,而在于元素的数量。
在第二种情况下,差值是1个字节,但它被sizeof(long)除。注意,因为这是未定义的行为,所以这里的任何答案都是正确的。
重新解释指针的基本类型不会更改其地址。但是指针算法会根据指针类型产生不同的结果。所以你在这里描述的是完全正确的,这也是我所期望的。请参阅指针算术。
它为pi1 - pi
做整数(长)指针运算;
如果p1
是&p[4]
,您会看到它为d1
打印1
,而差异实际上是4个字节。这是因为sizeof (long)
=4个字节。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 当关系运算符的含义相同时,为什么结果不同?
- 测试结果乘加减除法可能为一组数字
- 将一组数字相加或相减以达到一个值
- 两个数字相减时的小数
- 为什么这两个指针相减会得到不同的结果
- 用MKL做两个矩阵的相减
- 为什么检查分配操作的结果有效,但不能与其他条件相结合
- 试着计算两次之间的差,不要相减
- sin(<减零>) 不会在 Visual Studio 2013 64 位上返回预期的结果