gpt4 book ai didi

减去指针时的 C++ 未定义行为

转载 作者:行者123 更新时间:2023-12-01 13:42:35 26 4
gpt4 key购买 nike

C++ 标准 says从非数组元素中减去指针是 UB:

int a, b;
&a - &b; // UB, since pointers don't point to the same array.

但是如果两个指针都被转换为 uintptr_t,那么两个表达式都不再是指针表达式,从标准的角度来看,减去它们似乎是合法的:
int a, b;
reinterpret_cast<uintptr_t>(&a) - reinterpret_cast<uintptr_t>(&b);

这是正确的还是我错过了什么?

最佳答案

在行为并非未定义的意义上,整数的减法是合法的。

但是该标准在技术上没有保证转换整数的值,因此您也不能保证减法结果的值(与未指定的整数值相关的除外) - 您可能会得到一个大值或一个小值(或者如果指针具有不可相互转换的类型,则不同对象的转换整数相减甚至可能产生零)取决于系统。

此外,如果你做了一些其他的指针运算会导致一个指针值,即把指针转换为整数并添加偏移量,那么技术上不能保证将加法结果转换回指针类型会产生指针值与原始偏移量。但它可能会工作(假设在该地址确实存在正确类型的对象),除非在使用分段内存或更奇特的系统上。

关于减去指针时的 C++ 未定义行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60526907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com