【问题标题】:dereference an integer pointer on 64 bit platform取消引用 64 位平台上的整数指针
【发布时间】:2017-08-04 19:42:21
【问题描述】:

如果我们取消引用一个整数指针,比如 * (int * )
众所周知,整数指针在 64 位平台中占主导地位的 8 个字节。但整数在 64 平台上仍然需要 4 个字节。

如果我想取消引用一个指针,它的内存开头包含另一个指针地址。所以实际上我想取前 8 个字节的值。取消引用 * (int *) 会得到 4 字节还是 8 字节?我认为它应该是 4 字节,因为整数是 4 字节。但是我怎样才能在 64 位平台上获得 8 字节呢?不知道平台是32位还是64位。

【问题讨论】:

  • 这有点难以理解。可以给我们一个小代码sn-p作为例子吗?
  • 如果“其内存的开头包含另一个指针地址”,您需要通过指向指针的指针而不是指向 int 的指针取消引用它。如果某个地址的“事物”是另一个地址,那么指向指针的指针是到达(并最终通过)它的唯一合乎逻辑的方式。综上所述,这具有几乎令人难以抗拒的辛辣香气XY problem。你真正在做什么,你是如何将这个动物园作为你解决它的机制的?
  • 如果你想强制使用 8 个字节,你可以使用 int64_t 而不是 int
  • 好像你想要一个指向指针的指针。或指向 64 位整数类型的指针。说清楚。
  • 指针本身有多长并不重要,除非您只想像嵌入式编程中那样为其分配整数“地址”值。但即便如此,使用 uint64_t 等固定长度整数也很容易避免问题

标签: c pointers dereference


【解决方案1】:

让我们弄清楚一些事情(这些都是独立于平台的,但在大多数情况下),如果在您的系统上:

sizeof(int) is 4 bytes
sizeof(int*) is 4 on 32bit and 8 on 64bit
sizeof(int**) is 4 on 32bit and 8 on 64bit

当您取消引用 int* 时,您正在提取 int。原始的int* 在 64 位上可能是 8 个字节,但您将从 32 位或 64 位系统获得 4 个字节。

当您取消引用 int** 时,您正在提取 int*。原始int** 可能是 32 位上的 4 个字节或 64 位上的 8 个字节,但是您将从 32 位系统中获得 4 个字节,从 64 位系统中获得 8 个字节,因为您正在提取 int*

【讨论】:

    【解决方案2】:

    我不确定我是否正确理解了您的问题,但实际上我认为您真的完全没有问题,因为编译器会自动为您处理字长,为每个平台生成正确的代码。所以让我们假设你调用了一个函数,它返回一个指向 int 指针的指针:

    int** ppiValue = SomeFunction ();
    

    如果你取消引用这个指针,你会得到一个指向 int 的指针,它在每个平台上都有适当的大小:

    int* piValue = *ppiValue;
    

    这将是 64 位处理器上的 8 个字节,或 32 位处理器上的 4 个字节。编译器负责为选定的目标平台选择正确的大小。现在让我们取消引用这个指针:

    int iValue = *piValue;
    

    这将是两个处理器上的 4 字节值。再一次,编译器负责生成正确的机器代码指令。

    所以不要打扰 - 只要您依赖强类型并且不使用危险的类型转换,编译器将处理低级间接细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多