1

私は次のコードを試しています:

unsigned long * foo = (unsigned long *) 0x200000;

したがって、私が理解しているように、fooはunsignedlong0x200000を指します。さて、やってみると

std::cout<<foo[0];

これで値が出力されるはずだと思いました0x200000(10進数の場合もあります)。なぜなら、foo[0] = *(foo + 0) = 0x200000。しかし、実際には印刷され0ます。

私がここで欠けているものは何ですか?

4

2 に答える 2

5

あなたは誤解している、

unsigned long * foo = (unsigned long *) 0x200000;

0x200000をのアドレスとして解釈しますunsigned longunsigned longそれがあなたのプログラムで合法的にアクセスできるアドレスである可能性は非常に低いので、

std::cout<<foo[0];

ほぼ確実に未定義の動作であり、セグメンテーション違反を引き起こす可能性があります。ただし、あなたの場合、そのメモリ位置にアクセスしてもセグメンテーション違反は発生せず、そこにあるビットは解釈されて、として出力され、unsigned longたまたますべて0でした。

于 2012-10-04T18:50:21.707 に答える
0
type * pointerName = addressItPointsTo;

pointerName[0]と同じです*pointerName。ポインタを逆参照し、ポインタが指すアドレスの値も取得することを意味します。たまたま 0 になるだけですが、通常はセグメンテーション違反が発生します。

于 2012-10-04T18:54:59.020 に答える