计算地址差异是未定义的行为吗?



假设我执行以下操作:

void g(int* x)
{
int y = 0;
auto diff = uintptr_t(&y) - uintptr_t(x);
}
void f()
{
int x = 0;
g(&x);
}

diff是否仅具有未定义的值,或者代码是否调用未定义的行为?根据规范,代码是否保证运行良好并计算diff的值,可能毫无意义,还是调用 UB?我相信有一些不相关的变量,但无法确定它。

我对自(包括(C++ 11 以来的任何标准的答案感兴趣。

讨论源于以下评论:C++中的打印堆栈

引用C++11标准草案。关于将指针转换为整数的主题

[重新诠释]

5 整型或枚举型的值可以显式 转换为指针。转换为整数 足够的大小(如果实现中存在任何此类大小(并返回 相同的指针类型将具有其原始值;之间的映射 指针和整数是实现定义的。

由于必须为要编译的代码定义uintptr_t因此目标计算机上存在一个整数类型,该类型能够作为指针到整数转换的目标。映射是实现定义的,但最重要的是结果不是不确定的。这意味着您可以为两次转换获得一些有效的整数。

因此,减法不是未定义的行为。但结果是定义了实现。

将指针转换为足够大小的整数是明确定义的,从另一个整数中减去无符号整数是很好的定义,无论它们的值如何。这里没有未定义的行为。

而且,标准不保证转换后的整数的任何特定值,因此也不保证它们的减法结果。

相关内容

最新更新