【问题标题】:How is a pointer stored in memory?指针是如何存储在内存中的?
【发布时间】:2012-07-03 12:36:50
【问题描述】:

我正在开发一个操作系统项目,我只是想知道指针是如何存储在内存中的?我知道一个指针是 4 个字节,那么指针是如何在 4 个字节之间分布的呢?

我的问题是,我正在尝试存储一个指向 4 字节内存插槽的指针。假设指针是 0x7FFFFFFF。 4 个字节中的每个字节存储了什么?

【问题讨论】:

  • 如果操作系统映射虚拟内存,完全取决于硬件架构和操作系统。

标签: memory pointers operating-system


【解决方案1】:

指针的存储方式与任何其他多字节值相同。这 4 个字节根据系统的字节顺序存储。假设4个字节的地址如下:

大端(最高有效字节在前):

Address       Byte
0x1000        0x7F
0x1001        0xFF
0x1002        0xFF
0x1003        0xFF

小端(最低有效字节在前):

Address       Byte
0x1000        0xFF
0x1001        0xFF
0x1002        0xFF
0x1003        0x7F

顺便说一句,4 字节地址是 32 位系统。 64 位系统有 8 个字节的地址。

编辑: 要引用指针的每个单独部分,您需要使用指针。 :) 假设你有:

int i = 0;
int *pi = &i; // say pi == 0x7fffffff
int **ppi = π // from the above example, int ppi == 0x1000

简单的指针算法将为您提供指向每个字节的指针。

【讨论】:

  • 完美!这正是我所需要的。现在,如果给我一个指针,我如何引用每个单独的部分,例如 0x7F、0xFF 等?
【解决方案2】:

您应该阅读Endianness。但是,通常您不会一次只使用一个字节的指针,因此字节的顺序无关紧要。

更新:这是一个使用已知值制作假指针然后打印出它的每个字节的示例:

#include <stdio.h>

int main(int arc, char* argv[]) {
  int *p = (int *) 0x12345678;
  unsigned char *cp = (unsigned char *) &p;

  int i;
  for (i = 0; i < sizeof(p); i++)
    printf("%d: %.2x\n", i, cp[i]);

  return 0;
}

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 2014-10-03
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多