4

私はOSプロジェクトに取り組んでいますが、ポインタがメモリにどのように格納されているのか疑問に思っていますか?ポインタが4バイトであることを理解していますが、ポインタは4バイト間でどのように分散されますか?

私の問題は、4バイトのメモリスロットへのポインタを格納しようとしていることです。ポインタが0x7FFFFFFFであるとしましょう。4バイトのそれぞれに何が格納されていますか?

4

2 に答える 2

5

Endiannessを読んでください。ただし、通常、一度に 1 バイトのポインターだけを処理することはないため、バイトの順序は関係ありません。

更新: 既知の値で偽のポインターを作成し、その各バイトを出力する例を次に示します。

#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;
}
于 2012-07-03T05:14:37.523 に答える
5

ポインタが格納される方法は、他のマルチバイト値と同じです。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 = &pi; // from the above example, int ppi == 0x1000

単純なポインター演算では、各バイトへのポインターが得られます。

于 2012-07-03T05:16:41.713 に答える