3

私はC++に非常に慣れていないので、非常に明白な何かが欠けている場合はお詫びします。ポインタなどについて説明しているC++のチュートリアルを読んでいました。

チュートリアルでは、次の例が示されています。

    andy = 25;
    ted = &andy;
    beth = *ted;

ベスは本当に&andyと同じであることに気づきました。そこで、コードを次のように変更しました。

    andy = 25;
    beth = *(&andy);

&andyを印刷すると、andyが参照するメモリ位置がわかります。コードを実行するたびに、特定のメモリ位置を取得しました:0x28ff18

変数の名前を変更しても、メモリの場所(これは私が想定しているものです)は変更されません。チュートリアルによると、メモリの場所はオペレーティングシステムによって自動的に割り当てられます。andyがいるメモリ位置を変更する必要があるコードで何を変更できますか?

ただし、私の主な質問は次のとおりです。コード内のメモリ位置をに変更して、&andyに置き換えようとしました。

    andy = 25;
    beth = *(0x28ff18);

これは、bethが値25を保持すると仮定して行いました。これは、メモリ位置0x28ff18に残っている最後の値です。

ただし、このコードを実行しようとするとエラーが発生しました。

また、0x28ff18を文字列、文字、整数として設定しようとしましたが、beth = *(thatVariable);は実行されませんでした。仕事。

説明が不十分な場合はお詫び申し上げますが、自分がやろうとしていることを成し遂げる方法はないかと思います。

4

1 に答える 1

5

変数の名前を変更しても、メモリの場所(これは私が想定しているものです)は変更されません。

物事の名前はコンパイル時のアーティファクトです。コンパイラーが完了すると、変数が、、、または1と呼ばれたかどうかは関係andyありdummyませx10001909230492830492834

andyがいるメモリ位置を変更する必要があるコードで何を変更できますか?

その前にさらに変数を追加します。システムは変数を任意の論理アドレスに配置できるため、これが機能することは保証されていませんが、変数を移動させる可能性は十分にあります。

ただし、このコードを実行しようとするとエラーが発生しました([固定アドレスの参照解除])。

次のように、ポインタにキャストする必要があり0x28ff18ます:((int *)0x28ff18)。これはコンパイルされますが、機能しない場合があります。一般に、固定アドレスに配置されたレジスタを介してメモリマップドハードウェアにアクセスする場合を除いて、固定アドレスをハードコーディングすることは危険です。


1デバッグを除く。それでも、その変数の名前を最も気にするのはあなたです。

于 2013-01-18T02:18:00.907 に答える