【问题标题】:Does uintptr_t store the address of a pointer or its value?uintptr_t 是否存储指针的地址或其值?
【发布时间】:2018-07-26 11:06:39
【问题描述】:

假设我有以下代码:

Foo *foo = something();
uintptr_t bar = reinterpret_cast<uintptr_t>(foo);

bar是代表foo的地址还是foo指向的地址?我相信是foo的地址,但我想确定我没有弄错。

一些说明

What is uintptr_t data type 解释说

在 C99 中,它被定义为“无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为该类型,然后再转换回指向 void 的指针,结果将与原始指针进行比较” .

但这并没有说明 什么 正在被存储。编译器能否将foo 指向的地址存储在bar 中,然后在从uintptr_t 转换回Foo 时构造一个具有不同地址的新指针?也许我误解了指针比较,但是由于它们指向同一个对象,它们不会比较相等吗?

我想我正在寻找一些关于是否添加以下行的迂腐解释:

Foo *foo2 = reinterpret_cast<Foo *>(bar);

这里到底发生了什么?未定义的行为? foo2 只是指向与foo 相同的对象?

【问题讨论】:

  • foo 的地址是&amp;foo,这是一个Foo** 值。

标签: c++


【解决方案1】:

这取决于演员应用于什么。

uintptr_t bar = (uintptr_t)foo;中,它将foo的值(指向对象的地址)存储在bar中。

更喜欢使用 C++ 强制转换,它们向读者传达了更多信息,并且在维护期间更加健壮 - 最佳实践:

uintptr_t bar = reinterpret_cast<uintptr_t>(foo);

【讨论】:

  • 为了简洁起见,我使用了 C 风格的演员表。我的实际代码使用reinterpret_cast。我会在问题中更正。
  • 您能否澄清一下它是如何取决于所使用的演员表的,仅仅是出于好奇?
  • @JonHarper 例如reinterpret_cast&lt;uintptr_t&gt;(foo)reinterpret_cast&lt;uintptr_t&gt;(&amp;foo) 是不同的转换表达式。
【解决方案2】:

它是一个整数值,代表foo指向的地址。

如果你把它写成

uintptr_t bar = (uintptr_t)(&foo);

那么它将是foo 本身的地址。

【讨论】:

  • 啊。这就是我一直在寻找的。​​span>
猜你喜欢
  • 2014-10-03
  • 1970-01-01
  • 2010-11-30
  • 2022-01-11
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多