【问题标题】:Dereferencing addresses of one type as addresses of another将一种类型的地址取消引用为另一种类型的地址
【发布时间】:2015-07-26 21:22:48
【问题描述】:

这个问题适用于任何允许用户操作指针的编码语言,但我特别问的是 C++。

假设我们有两种大小相同的类型,例如,假设 (long) 和 (int) 的大小都是 8 字节。让我们声明一个 (long) 和一个 (int):

long someLong = 10;
int someInt = 20;

假设someLongsomeInt的地址分别是X和Y,并假设十六进制,Y = X + 80。如果我尝试手动将X移动到Y然后取消引用它,我不会如我所料,得到 20 的值。这是为什么呢?

cout << &someLong + 10    
cout << &someInt             // these two return the same starting address location

cout << *(&someLong + 10)    // dereferences an int as a long, but does not return 20!

【问题讨论】:

  • 在为 x64 编译时,int 和 long 之间的差异在 0 到 4 个字节之间,具体取决于您使用的编译器。 GCC 使用的是 LP64 模型,也就是说 int 是 32 位,而 long 在 64 位模式下是 64 位。
  • @yanivx 即使指针大小相同,我也不确定这样的代码的可移植性如何。特别是,可能实现选择以不同的方式表示someLongsomeInt
  • @vsoftco 实现根据架构选择大小

标签: c++ pointers types casting reference


【解决方案1】:

我认为这在技术上取决于实现,因此无法保证。

另一方面,根据我的经验,在实践中使用指向同一内存的不同类型的指针往往会按照您期望的方式工作。

还有这个:

#include <iostream>
using namespace std;

int main()
{
    long someLong = 10;
    int someInt = 20;

    cout << &someLong + 1 << '\n';
    cout << &someInt << '\n';

    cout << *(&someLong + 1);

    return 0;
}

works for me 输出 20。

甚至希望回答为什么它不适合您,我们必须查看您的实际代码。了解您使用的编译器可能会有所帮助。

【讨论】:

  • 编译代码使用的平台是windows吗?
  • 假设类型有相似的表示。通过float* 访问int*,例如int* p = (int*)&amp;some_float 将不起作用,即使sizeof(int) == sizeof(float)
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2017-08-28
  • 2021-10-16
  • 2011-09-24
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多